程式引數處理 getopt

2021-05-23 22:43:19 字數 4697 閱讀 1499

╮(╯▽╰)╭,把以前用到的東西粘過來,搞cui用到

1、posix約定

下面是posix標準中關於程式名、引數的約定:

2、命令列引數解析函式getopt()

getopt()函式宣告如下:

#include

int getopt(int argc, char * const argv, const char *optstring);

extern char *optarg;

extern int optind, opterr, optopt;

該函式的argc和argv引數通常直接從main()的引數直接傳遞而來。optstring是選項字母組成的字串。如果該字串裡的任一字元後面有冒號,那麼這個選項就要求有選項引數。

當給定getopt()命令引數的數量(argc)、指向這些引數的陣列(argv) 和選項字串(optstring) 後,getopt() 將返回第乙個選項,並設定一些全域性變數。使用相同的引數再次呼叫該函式時,它將返回下乙個選項,並設定相應的全域性變數。如果不再有可識別的選項,將返回-1,此任務就完成了。

函式getopt() 所設定的全域性變數包括:

char *optarg——當前選項引數字串(如果有)。

int optind——argv的當前索引值。當getopt()在while迴圈中使用時,迴圈結束後,剩下的字串視為運算元,在argv[optind]至argv[argc-1]中可以找到。

int opterr——這個變數非零時,getopt()函式為「無效選項」和「缺少引數選項,並輸出其錯誤資訊。

int optopt——當發現無效選項字元之時,getopt()函式或返回'?'字元,或返回':'字元。並且optopt包含了所發現的無效選項字元。,當optstring開頭沒有指定』:』時,無效選項或缺引數都返回』?』

簡單例子,測試帶參選項與不帶參選項,**opt.c

#include

#include

int main(int argc, char **argv)

} return; }

測試結果。注意最後帶參選項-d引數缺失時的處理,處理提示可自定義,後面會講到。

[root@amanda optest]# ./opt -a

**** a! optarg:(null) optind:2 opterr:1

[root@amanda optest]# ./opt -a -b

**** a! optarg:(null) optind:2 opterr:1

**** b! optarg:(null) optind:3 opterr:1

[root@amanda optest]# ./opt -a -b -c

**** a! optarg:(null) optind:2 opterr:1

**** b! optarg:(null) optind:3 opterr:1

**** c! optarg:(null) optind:4 opterr:1

[root@amanda optest]# ./opt -a -b -c -d ohyeah

**** a! optarg:(null) optind:2 opterr:1

**** b! optarg:(null) optind:3 opterr:1

**** c! optarg:(null) optind:4 opterr:1

**** d! optarg:ohyeah optind:6 opterr:1

[root@amanda optest]# ./opt -cb

**** c! optarg:(null) optind:1 opterr:1

**** b! optarg:(null) optind:2 opterr:1

[root@amanda optest]# ./opt -d

./opt: option requires an argument -- d

**** ?! optarg:(null) optind:2 opterr:1

當帶參選項檢查到無引數輸入時,getopt()函式會首先提示」

./opt: option requires an argument -- d

」 然後返回字元』?』賦值於opc。

如果不希望輸出任何錯誤資訊,或更希望輸出自定義的錯誤資訊。可以採用以下兩種方法來更改getopt()函式的出錯資訊輸出行為。

(1)在呼叫getopt()之前,將opterr設定為0,這樣就可以在getopt()函式發現錯誤的時候強制它不輸出任何訊息;

(2)如果optstring引數的第乙個字元是冒號,那麼getopt()函式就會保持沉默,並根據錯誤情況返回不同字元,如下:

「無效選項」 ——getopt()返回'?',由於optopt包含了無效選項字元(比如在上例中使用引數 –x等)。

「缺少選項引數」 ——getopt()返回':',由於選項缺參(比如使用命令」./opt –d 」)。

如果optstring的第乙個字元不是冒號,那麼無論是無效選項還是缺少引數,getopt()都返回'?'。注意:存在乙個問題是,假如使用」./opt  -d -x」,這原本是選項-d引數缺失的情況,但getopt()會錯誤地把-x認為是-d的引數。

3、對長選項的支援getopt_long()

20 世紀90 年代,unix 應用程式開始支援長選項,即一對短橫線、乙個描述性選項名稱,還可以包含乙個使用等號連線到選項的引數。比如」-help」。

getopt_long() 是同時支援長選項和短選項的getopt() 版本。下面是他們的宣告:

#include

int getopt_long(int argc, char * const argv, const char *optstring, const struct option *longopts, int *longindex);

int getopt_long_only(int argc, char * const argv,const char *optstring,const struct option *longopts, int *longindex);

struct option;

getopt_long()的前三個引數與上面的getopt()相同,第4個引數是指向option結構的陣列,option結構被稱為「長選項表」。longindex引數如果沒有設定為null,那麼它就指向乙個變數,這個變數會被賦值為尋找到的長選項在longopts中的索引值,這可以用於錯誤診斷。

option結構中flag欄位的含義,如果這個指標為null,那麼getopt_long()返回該結構val欄位中的數值。如果該指標不為null,getopt_long()會使得它所指向的變數中填入val欄位中的數值,並且getopt_long()返回0。如果flag不是null,但未發現長選項,那麼它所指向的變數的數值不變;欄位val的的含義,這個值是發現了長選項時的返回值,或者flag不是null時載入*flag中的值。典型情況下,若flag不是null,那麼val是個真/假值,譬如1或0;另一方面,如果flag是null,那麼val通常是字元常量,若長選項與短選項一致,那麼該字元常量應該與optstring中出現的這個選項的引數相同。

每個長選項在長選項表中都有乙個單獨條目,該條目裡需要填入正確的數值。陣列中最後的元素的值應該全是0。陣列不需要排序,getopt_long()會進行線性搜尋。函式getopt_long()的所有返回值含義如下。

返回值含 義

0         getopt_long()設定乙個標誌,它的值與option結構中的val欄位的值一樣

1         每碰到乙個命令列引數,optarg都會記錄它

'?'       無效選項

':'       缺少選項引數

'x'       選項字元'x',在選項中自由設定的

-1        選項解析結束

測試用例如下

#include

#include

#include

int main(int argc, char **argv), ,

}; while((opc=getopt_long(argc,argv,"ab:",longopts,null))!=-1)

} return; }

測試結果如下:

[root@amanda optest]# ./optlong -a --version

**** a! optarg:(null) optind:2 opterr:1

**** v! optarg:(null) optind:3 opterr:1

[root@amanda optest]# ./optlong --help

**** h! optarg:(null) optind:2 opterr:1

當flag不為null時,getopt_long*()會為你設定標記變數。如果flag不為null,時,getopt_long()可以自動為各選項所對應的標記變數設定標記,這樣就能夠將switch語句中的情況減少。

用getopt處理main函式的引數

在c語言中,main函式的宣告如下 int main int argc,char argv argc是指程式引數的個數,包括程式名本身,如果程式不帶引數,argc為1 argv的每個陣列元素存放乙個程式引數,程式名存放在argv 0 例如 ls l 此時,argc為2,argv 0 是ls,argv...

python 命令列引數處理 getopt模組詳解

有時候我們需要寫一些指令碼處理一些任務,這時候往往需要提供一些命令列引數,根據不同引數進行不同的處理,在python裡,命令列的引數和c語言很類似 因為標準python是用c語言實現的 在c語言裡,main函式的原型為int main int argc,char ar 這裡主要指linux平台,ar...

使用 getopt 處理命令行長引數

getopt命令並不是bash的內建命令,它是由util linux包提供的外部命令。getopt 與 getopts 的區別 getopts 是 shell 內建命令,getopt 是乙個獨立外部工具 getopt 命令選項說明 getopt 命令的選項說明 a 使getopt長選項支援 符號打頭...