linux 中解析命令行参数 (getopt_long用法)
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);
說明:函數中的argc和argv通常直接從main()到兩個參數傳遞而來。optsting是選項參數組成的字符串,如果該字符串里任一字母后有冒號,那么這個選項就要求有參數。下一個參數是指向數組的指針,這個數組是option結構數組,option結構稱為長選項表,其聲明如下:
?struct option {
????????????? const char *name;
????????????? int has_arg;
????????????? int *flag;
????????????? int val;
????????? };
結構中的元素解釋如下:
const char *name:選項名,前面沒有短橫線。譬如"help"、"verbose"之類。
int has_arg:描述長選項是否有選項參數,如果有,是哪種類型的參數,其值見下表:
符號常量???????????? 數值??????????? 含義
no_argument??????????? 0??????????? 選項沒有參數
required_argument????? 1??????????? 選項需要參數
optional_argument????? 2??????????? 選項參數是可選的
int *flag:
如果該指針為NULL,那么getopt_long返回val字段的值;
如果該指針不為NULL,那么會使得它所指向的結構填入val字段的值,同時getopt_long返回0
int val:
如果flag是NULL,那么val通常是個字符常量,如果短選項和長選項一致,那么該字符就應該與optstring中出現的這個選項的參數相同;
最后一個參數:longindex參數一般賦為NULL即可;如果沒有設置為NULL,那么它就指向一個變量,這個變量會被賦值為尋找到的長選項在longopts中的索引值,這可以用于錯誤診斷。
注:GNU提供的getopt-long()和getopt-long-only()函數,其中,后者的長選項字串是以一個短橫線開始的,而非一對短橫線。
linux 命令行約定:
???? 幾乎所有的GNU/Linux程序都遵循一些命令行參數定義的約定。程序希望出現的參數可以分成兩種:選項(options or flags)、其他類型的的參數。Options修飾了程序運行的方式,其他類型的參數則提供了輸入(例如,輸入文件的名稱)。
???? 對于options類型參數可以有兩種方式:
???? 1)短選項(short options):顧名思義,就是短小參數。它們通常包含一個連字號和一個字母(大寫或小寫字母)。例如:-s,-h等。
???? 2)長選項(long options):長選項,包含了兩個連字號和一些大小寫字母組成的單詞。例如,--size,--help等。
???? *注:一個程序通常會提供包括short options和long options兩種參數形式的參數。
???? 對于其他類型參數的說明:
???? 這種類型的參數,通常跟隨在options類型參數之后。例如,ls –s /功能為顯示root目錄的大小。’/’這個參數告訴ls要顯示目錄的路徑。
getopt_long()函數使用規則:
(1)使用前準備兩種數據結構
??? 字符指針型變量
??? 該數據結構包括了所有要定義的短選項,每一個選項都只用單個字母表示。如果該選項需要參數(如,需要文件路徑等),則其后跟一個冒號。例如,三個短選項分別為‘-h’‘-o’‘-v’,其中-o需要參數,其他兩個不需要參數。那么,我們可以將數據結構定義成如下形式:
const char * const shor_options = “ho:v” ;
??? struct option 類型數組
??? 該數據結構中的每個元素對應了一個長選項,并且每個元素是由四個域組成。通常情況下,可以按以下規則使用。第一個元素,描述長選項的名稱;第二個選項,代表該選項是否需要跟著參數,需要參數則為1,反之為0;第三個選項,可以賦為NULL;第四個選項,是該長選項對應的短選項名稱。另外,數據結構的最后一個元素,要求所有域的內容均為0,即{NULL,0,NULL,0}。下面舉例說明,還是按照短選項為‘-h’‘-o’
‘-v’的例子,該數據結構可以定義成如下形式:
const struct option long_options = {
{? “help”,????? 0,?? NULL,?? ‘h’? },
{? “output”,??? 1,?? NULL,?? ‘o’? },
{? “verbose”,?? 0,?? NULL,?? ‘v’? },
{? NULL,????? 0,??? NULL,?? 0? }
};
(2)調用方法
???? 參照(1)準備的兩個數據結構,則調用方式可為:
getopt_long( argc, argv, short_options, long_options, NULL);
(3)幾種常見返回值
??? (a)每次調用該函數,它都會分析一個選項,并且返回它的短選項,如果分析完畢,即已經沒有選項了,
則會返回-1。
??? (b)如果getopt_long()在分析選項時,遇到一個沒有定義過的選項,則返回值為‘?’,此時,程序員可
以打印出所定義命令行的使用信息給用戶。
??? (c)當處理一個帶參數的選項時,全局變量optarg會指向它的參數
??? (d)當函數分析完所有參數時,全局變量optind(into argv)會指向第一個‘非選項’的位置
實踐小例子:
#include <getopt.h>
char *l_opt_arg;
char* const short_options = "nbl:";
struct option long_options[] = {
{ "name", 0, NULL, 'n' },
{ "bf_name", 0, NULL, 'b' },
{ "love", 1, NULL, 'l' },
{ 0, 0, 0, 0},
};
int main(int argc, char *argv[])
{
int c;
while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1)
{
switch (c)
{
case 'n':
printf("My name is XL.\n");
break;
case 'b':
printf("His name is ST.\n");
break;
case 'l':
l_opt_arg = optarg;
printf("Our love is %s!\n", l_opt_arg);
break;
}
}
return 0;
}
編譯并運行:
[root@localhost liuxltest]# gcc -o getopt getopt.c
[root@localhost liuxltest]# ./getopt -n -b -l forever
My name is XL.
His name is ST.
Our love is forever!
[root@localhost liuxltest]#
[root@localhost liuxltest]# ./getopt -nb -l forever
My name is XL.
His name is ST.
Our love is forever!
[root@localhost liuxltest]# ./getopt -nbl forever??
My name is XL.
His name is ST.
Our love is forever!
轉自:http://blog.csdn.net/ast_224/article/details/3861625
轉載于:https://www.cnblogs.com/hnrainll/archive/2011/09/15/2176933.html
總結
以上是生活随笔為你收集整理的linux 中解析命令行参数 (getopt_long用法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JDBCUtils工具类编写
- 下一篇: 十大最急需IT技术人才榜:Java开发人