getopt_long支持長選項的命令行解析,,使用man getopt_long,,得到其聲明如下: #include <getopt.h> 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); 說明:函數(shù)中的argc和argv通常直接從main()到兩個參數(shù)傳遞而來,。optsting是選項參數(shù)組成的字符串,如 果該字符串里任一字母后有冒號,,那么這個選項就要求有參數(shù),。下一個參數(shù)是指向數(shù)組的指針,這個數(shù)組是 option結構數(shù)組,,option結構稱為長選項表,,其聲明如下: struct option { const char *name; int has_arg; int *flag; int val; }; 結構中的元素解釋如下: const char *name:選項名,前面沒有短橫線,。譬如"help",、"verbose"之類。 int has_arg:描述長選項是否有選項參數(shù),如果有,,是哪種類型的參數(shù),,其值見下表: 符號常量 數(shù)值 含義 no_argument 0 選項沒有參數(shù) required_argument 1 選項需要參數(shù) optional_argument 2 選項參數(shù)是可選的 int *flag: 如果該指針為NULL,那么getopt_long返回val字段的值,; 如果該指針不為NULL,,那么會使得它所指向的結構填入val字段的值,同時getopt_long返回0 int val: 如果flag是NULL,,那么val通常是個字符常量,,如果短選項和長選項一致,那么該字符就應該與optstring中 出現(xiàn)的這個選項的參數(shù)相同,; 最后一個參數(shù):longindex參數(shù)一般賦為NULL即可,;如果沒有設置為NULL,那么它就指向一個變量,,這個變量 會被賦值為尋找到的長選項在longopts中的索引值,,這可以用于錯誤診斷。 注:GNU提供的getopt-long()和getopt-long-only()函數(shù),,其中,,后者的長選項字串是以一個短橫線開始的 ,而非一對短橫線,。 linux 命令行約定: 幾乎所有的GNU/Linux程序都遵循一些命令行參數(shù)定義的約定,。程序希望出現(xiàn)的參數(shù)可以分成兩種:選 項(options or flags)、其他類型的的參數(shù),。Options修飾了程序運行的方式,,其他類型的參數(shù)則提供了輸 入(例如,輸入文件的名稱),。 對于options類型參數(shù)可以有兩種方式: 1)短選項(short options):顧名思義,,就是短小參數(shù)。它們通常包含一個連字號和一個字母(大寫 或小寫字母),。例如:-s,-h等,。 2)長選項(long options):長選項,,包含了兩個連字號和一些大小寫字母組成的單詞。例如,,-- size,,--help等。 *注:一個程序通常會提供包括short options和long options兩種參數(shù)形式的參數(shù),。 對于其他類型參數(shù)的說明: 這種類型的參數(shù),,通常跟隨在options類型參數(shù)之后。例如,ls –s /功能為顯示root目錄的大小,?!? ’這個參數(shù)告訴ls要顯示目錄的路徑。 getopt_long()函數(shù)使用規(guī)則: (1)使用前準備兩種數(shù)據(jù)結構 字符指針型變量 該數(shù)據(jù)結構包括了所有要定義的短選項,,每一個選項都只用單個字母表示,。如果該選項需要參數(shù)(如, 需要文件路徑等),,則其后跟一個冒號,。例如,三個短選項分別為‘-h’‘-o’‘-v’,,其中-o需要參數(shù),, 其他兩個不需要參數(shù)。那么,,我們可以將數(shù)據(jù)結構定義成如下形式: const char * const shor_options = “ho:v” ; struct option 類型數(shù)組 該數(shù)據(jù)結構中的每個元素對應了一個長選項,,并且每個元素是由四個域組成。通常情況下,,可以按以下 規(guī)則使用,。第一個元素,描述長選項的名稱,;第二個選項,,代表該選項是否需要跟著參數(shù),需要參數(shù)則為1,, 反之為0,;第三個選項,可以賦為NULL,;第四個選項,,是該長選項對應的短選項名稱。另外,,數(shù)據(jù)結構的最后 一個元素,,要求所有域的內(nèi)容均為0,即{NULL,0,NULL,0},。下面舉例說明,,還是按照短選項為‘-h’‘-o’ ‘-v’的例子,該數(shù)據(jù)結構可以定義成如下形式: const struct option long_options = { { “help”, 0, NULL, ‘h’ }, { “output”, 1, NULL, ‘o’ }, { “verbose”, 0, NULL, ‘v’ }, { NULL, 0, NULL, 0 } }; (2)調(diào)用方法 參照(1)準備的兩個數(shù)據(jù)結構,,則調(diào)用方式可為: getopt_long( argc, argv, short_options, long_options, NULL); (3)幾種常見返回值 (a)每次調(diào)用該函數(shù),,它都會分析一個選項,并且返回它的短選項,,如果分析完畢,,即已經(jīng)沒有選項了,, 則會返回-1。 (b)如果getopt_long()在分析選項時,,遇到一個沒有定義過的選項,,則返回值為‘?’,此時,,程序員可 以打印出所定義命令行的使用信息給用戶,。 (c)當處理一個帶參數(shù)的選項時,全局變量optarg會指向它的參數(shù) (d)當函數(shù)分析完所有參數(shù)時,,全局變量optind(into argv)會指向第一個‘非選項’的位置 實踐小例子:
編譯并運行: [root@localhost liuxltest]# gcc -o getopt getopt.c [root@localhost liuxltest]# ./getopt -n -b -l forever [root@localhost liuxltest]# ./getopt -nb -l forever |
|
來自: danydany_ok > 《C》