前言
平時我們在shell命令行上輸入的命令都是應用程序,比如ls,ifconfig,vi等。我們下載的busybox源碼中就包含著這些程序源碼,那接下來我們來看看如何實現一個命令。
如何實現
我們先分析一下其他的命令,比如gcc:
gcc helloworld.c -o helloworld
上面的編譯指令中,gcc就是命令程序,然后后面的三個都是傳給它的參數。程序是如何獲取到參數的呢?我們都知道main函數的定義如下:
int main(int argc, char * argv[])
argc是參數個數,argv是參數值。所以大家應該都知道如何獲取參數了吧。
有了參數,我們就要進行解析了。這就有兩種方法:
對參數進行一個一個的判斷解析
使用getopt函數進行解析
第一種方式工作量非常大,所以我們來使用第二種方式。
getopt函數介紹
#include int getopt(int argc, char * const argv[], const char *optstring);
argc:參數個數,直接將main函數中的argc傳給該函數。
argv:參數數組,直接將main函數中的argv傳給該函數。
optstring: 選項字符串。
里面還有幾個額外的全局變量:
extern char *optarg; extern int optind, opterr, optopt;
optarg: 保存選項參數
optind: 記錄下一個檢索位置
opterr: 是否將錯誤信息輸出到stderr, 為0時表示不輸出
optopt: 不在選項字符串optstring中的選項
選項字符串
getopt函數中有個optstring參數 ,就是選項字符串。用來指定選項,就比如上面gcc命令中的-o,它就是一個選項。
那如何給getopt傳遞選項字符串呢?舉個例子:
a:b:cd::e
這個選項字符串對應命令行就是-a ,-b ,-c ,-d, -e選項。
冒號表示參數,一個冒號就表示這個選項后面必須帶有參數。這個參數可以和選項連在一起寫,也可以用空格隔開。
兩個冒號的就表示這個選項的參數是可選的,既可以有參數,也可以沒有參數,但要注意有參數時,參數與選項之間不能有空格。
實例
#include #include int main(int argc, char * argv[]) { int ch; printf("optind:%d,opterr:%d ", optind, opterr); printf("-------------------------- "); while ((ch = getopt(argc, argv, "abde::")) != -1) { printf("optind: %d ", optind); switch (ch) { case 'a': printf("option: -a "); break; case 'b': printf("option: -b "); printf("The argument of -b is %s ", optarg); break; case 'c': printf("option: -c "); printf("The argument of -c is %s ", optarg); break; case 'd': printf("option: -d "); break; case 'e': printf("option: -e "); printf("The argument of -e is %s ", optarg); break; case '?': printf("Unknown option: %c ",(char)optopt); break; } } return 0; }
運行結果:
-b選項沒有跟參數則報錯!
審核編輯:湯梓紅
-
Linux
+關注
關注
87文章
11229瀏覽量
208931 -
Linux系統
+關注
關注
4文章
591瀏覽量
27356 -
函數
+關注
關注
3文章
4306瀏覽量
62431 -
命令
+關注
關注
5文章
678瀏覽量
21984 -
Shell
+關注
關注
1文章
363瀏覽量
23297
原文標題:如何給你的Linux系統添加一個新的Linux命令
文章出處:【微信號:嵌入式悅翔園,微信公眾號:嵌入式悅翔園】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論