linux 輸入參數利用getopt、struct option、getopt_long、getopt_long_only解析

參考:點擊查看詳細解釋


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"


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章