前言
平時(shí)我們在shell命令行上輸入的命令都是應(yīng)用程序,比如ls,ifconfig,vi等。我們下載的busybox源碼中就包含著這些程序源碼,那接下來我們來看看如何實(shí)現(xiàn)一個(gè)命令。
如何實(shí)現(xiàn)
我們先分析一下其他的命令,比如gcc:
gcc helloworld.c -o helloworld
上面的編譯指令中,gcc就是命令程序,然后后面的三個(gè)都是傳給它的參數(shù)。程序是如何獲取到參數(shù)的呢?我們都知道m(xù)ain函數(shù)的定義如下:
int main(int argc, char * argv[])
argc是參數(shù)個(gè)數(shù),argv是參數(shù)值。所以大家應(yīng)該都知道如何獲取參數(shù)了吧。
有了參數(shù),我們就要進(jìn)行解析了。這就有兩種方法:
對參數(shù)進(jìn)行一個(gè)一個(gè)的判斷解析
使用getopt函數(shù)進(jìn)行解析
第一種方式工作量非常大,所以我們來使用第二種方式。
getopt函數(shù)介紹
#include int getopt(int argc, char * const argv[], const char *optstring);
argc:參數(shù)個(gè)數(shù),直接將main函數(shù)中的argc傳給該函數(shù)。
argv:參數(shù)數(shù)組,直接將main函數(shù)中的argv傳給該函數(shù)。
optstring: 選項(xiàng)字符串。
里面還有幾個(gè)額外的全局變量:
extern char *optarg; extern int optind, opterr, optopt;
optarg: 保存選項(xiàng)參數(shù)
optind: 記錄下一個(gè)檢索位置
opterr: 是否將錯(cuò)誤信息輸出到stderr, 為0時(shí)表示不輸出
optopt: 不在選項(xiàng)字符串optstring中的選項(xiàng)
選項(xiàng)字符串
getopt函數(shù)中有個(gè)optstring參數(shù) ,就是選項(xiàng)字符串。用來指定選項(xiàng),就比如上面gcc命令中的-o,它就是一個(gè)選項(xiàng)。
那如何給getopt傳遞選項(xiàng)字符串呢?舉個(gè)例子:
a:b:cd::e
這個(gè)選項(xiàng)字符串對應(yīng)命令行就是-a ,-b ,-c ,-d, -e選項(xiàng)。
冒號表示參數(shù),一個(gè)冒號就表示這個(gè)選項(xiàng)后面必須帶有參數(shù)。這個(gè)參數(shù)可以和選項(xiàng)連在一起寫,也可以用空格隔開。
兩個(gè)冒號的就表示這個(gè)選項(xiàng)的參數(shù)是可選的,既可以有參數(shù),也可以沒有參數(shù),但要注意有參數(shù)時(shí),參數(shù)與選項(xiàng)之間不能有空格。
實(shí)例
#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; }
運(yùn)行結(jié)果:
-b選項(xiàng)沒有跟參數(shù)則報(bào)錯(cuò)!
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11212瀏覽量
208721 -
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
590瀏覽量
27318 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4284瀏覽量
62325 -
命令
+關(guān)注
關(guān)注
5文章
678瀏覽量
21965 -
Shell
+關(guān)注
關(guān)注
1文章
363瀏覽量
23259
原文標(biāo)題:如何給你的Linux系統(tǒng)添加一個(gè)新的Linux命令
文章出處:【微信號:嵌入式悅翔園,微信公眾號:嵌入式悅翔園】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論