linux 中getopt和getopt_long 用法解析

lei7143發表於2016-07-21

linux 英文手冊:
http://man7.org/linux/man-pages/man3/getopt.3.html
參考部落格:
http://blog.csdn.net/lyh66/article/details/50098739

getopt解析引數

執行main(argc,argv),使用getopt(argc,argv,optstring)解析引數
引數optstring為選項字串, 告知 getopt()可以處理哪個選項以及哪個選項需要引數,如果選項字串裡的字母后接著冒號“:”,則表示還有相關的引數。
如getopt(argc, argv, “ls:fc:h::d:”)中,l和f 選項不需要引數,s,c,d需要引數,h可以有引數也可以沒有引數。
如在命令列:gcc -o main main.c
main -l -s aa -f -c kk

1.單個字元,表示選項,l,s,f,c,h,d均為選項
2.單個字元後接一個冒號:表示該選項後必須跟一個引數,引數緊跟在選項 後或者以空格隔開,該引數的指標賦給optarg
3.單 個字元後跟兩個冒號,表示該選項後可以跟一個引數,也可以不跟。如果跟一個引數,引數必須緊跟在選項後不能以空格隔開,如果沒有跟引數,則 optarg=NULL。

返回值

getopt()每次呼叫會逐次返回命令列傳入的引數,當沒有引數的最後的一次呼叫時,getopt()將返回-1
當解析到一個不在optstring裡面的引數,或者一個必選值引數不帶值時,返回’?’
其 它情況可以看上邊連結,例子也可以看上邊連結

getopt_long解析引數

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

getopt_long除了可以支援-開始的單字元開始選項,還支援–開始選項。如果只支援–開始選項,將optstring設定為”“。

struct option {
    const char *name;
    int         has_arg;
    int        *flag;
    int         val;
};

結構體option各個欄位的意思如下:
name 長選項的名字
has_arg
no_argument(或0):選項不攜帶引數;required_argument(或1):選項需要引數;optional_argument(或2):選項攜帶引數可選
flag
指定該長選項的返回值。如果flag是NULL,getopt_long會返回val。(比如,呼叫者可以設定val為短選項字元)否則,getopt_long會返回0,且flag指向的值設定為val的值,前提是該選項成功找到了。
val
當做返回值,或把值載入進flag所指的記憶體中。

longopts指向的陣列的最後一個元素值都設定為0。

如果longindex不是NULL,則它指向getopt_long()獲得的長選項longopts的下標。

相關文章