參考:點擊查看詳細解釋
1、struct option 結構體
struct option { const char *name; int has_arg; int *flag; int val; };
含義如下:
name指明長選項的名稱;
has_arg指明該選項是否帶參數,1爲是,0爲否,2爲可選;
flag指明長選項如何返回,如果flag爲NULL,則getopt_long返回val;否則返回0,flag指向的值賦值爲val變量的值。如果該長選項沒有發現,flag指向的值保持不變;
val指明返回的值,或者需要加載到被flag所指示的變量中的值。
option數組的最後一個元素必須全部填充0.
2、關於長選項和短選項
GNU/Linux的命令行選項有兩種類型:短選項和長選項,前者以 '-' 作爲前導符,後者以 '--' 作爲前導符
例如:
process -a w --add -b --file a.txt b.txt - -- -e c.txt
含義如下:
a是短選項,帶一個參數vv;
add是長選項,無參數;
b是短選項,無參數;
file是長選項,帶一個參數a.txt;
b.txt是參數;
-是參數,通常表示標準輸入,stdin; // 不懂
--是一個指示符,表明停止掃描參數,其後所有部分都是參數,而不是選項;//不懂
-e是參數;
c.txt是參數
3、選項分析函數
#include <unistd.h> int getopt(int argc, char * const argv[],const char *optstring); 全局變量: extern char *optarg; extern int optind, opterr, optopt; #define _GNU_SOURCE #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);
4、選項分析函數解析
1)getopt()函數,分析短選項
參數含義如下:
argc, argv是從main函數獲取的參數,原樣傳給getopt;argc記錄參數個數,包括函數名;argv存儲函數參數,包括函數名;
optstring爲字符串,指示如何分析參數。
關於optstring的幾點說明:
a、如果選項帶參數,該選項後接冒號,比如上例中optstring爲"a:b",指示a帶參數,b沒有參數;
b、如果選項帶可選參數,該選項後接兩個冒號,比如"a::b",表明a可能有參數,也可能沒有;
c、如果optstring的開頭字符爲':',表明如果指明選項帶參數,而實際命令行沒有參數時,getopt返回':'而不是'?'(默認情況下返回'?',和無法識別選項時返回一樣);
d、如果optstring的開頭字符爲'+',表明一但遇到一個無選項的參數(指參數前面沒有選項),馬上停止掃描,隨後的部分當作參數來解釋;
e、如果optstring的開頭字符爲'-',表明如果遇到無選項的參數,則把它當作選項1(不是字符'1')的參數(不是很明白)
f、該函數每解析完一個選項,就返回該選項字符。
g、如果選項帶參數,參數保存在optarg中。如果選項帶可選參數,而實際無參數時,optarg爲NULL。
h、當遇到一個不在optstring指明的選項時,返回字符‘?’;如果在optstring指明某選項帶參數而實際沒有參數時,返回字符‘?’或者字符‘:’,視optstring的第一個字符而定。這兩種情況選項的實際值被保存在optopt中。
i、當解析錯誤時,如果opterr爲1則自動打印一條錯誤消息(默認),否則不打印。
j、當解析完成時,返回-1。
k、每當解析完一個argv,optind就會遞增。如果遇到無選項的參數,getopt默認會把該參數調後一位(本人理解應該是指針位置往後串),接着解析下一個參數(這裏的參數包括:選項、選項所帶的參數、無選項的參數,是個廣義的參數概念)。如果解析完成後還有無選項的參數,則optind指示的是第一個無選項的參數在argv中的索引。
2)getopt_long()函數,同時可以分析短選項和長選項
getopt_long的最後一個參數longindex在函數返回時指向被搜索到的選項在longopts數組中的下標。longindex可以爲NULL,表明不需要返回這個值。
例子:
static const struct option lopts[] = {
{ "rtc", 1, 0, 'T'},
{ "rs485", 1, 0, '5'},
{ "spiw", 1, 0, 'S'},
{"capture", 1, 0, 'F'},
{"play", 1, 0, 'P'},
{"ipaddr", 1, 0, 'A'},
{ NULL, 0, 0, 0 }
};
int c;
while(1){
c = getopt_long(argc, argv, "A:T:5:F:P:S", lopts, NULL);
if (c == -1)
break;
switch(c){
參數保存在optarg中。。。
}
}
3)get_long_only()函數
getopt_long_only類似於getopt_long,但是它把'-'開頭的選項當作長選項來處理,一般情況下,這時結構體數組變量longopts中也會包含我們想分析的短選項。
如果該選項與長選項不匹配,而與短選項匹配,則可以作爲短選項解析。
在短選項找到的時候,getopt_long和getopt_long_only的表現和getopt一樣。如果長選項找到了,如果flag爲 NULL,返回val,否則返回0。
錯誤情況的處理和getopt一樣,只是返回'?'時還可能是別的情況引起的:選項含糊不明確或者無關參數。
Comments
SHELL編程如何解析命令行參數
用命令getopt,提供以下代碼片段供參考:
#!/bin/sh
while getopts xyz: arguments 2>/dev/null
do
case $arguments in
x) echo "option x";;
y) echo "option y";;
z) echo "option z with arg. $OPTARG";;
/?) echo "Usage: optdemo [-xy] [-z argment]"
exit 1;;
esac
done
echo "/$OPTIND is $OPTIND /$OPTERR is $OPTERR"