linux 中解析命令列參數 (getopt_long用法)

來源:互聯網
上載者:User

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 <stdio.h><br />#include <getopt.h><br />char *l_opt_arg;<br />char* const short_options = "nbl:";<br />struct option long_options[] = {<br /> { "name", 0, NULL, 'n' },<br /> { "bf_name", 0, NULL, 'b' },<br /> { "love", 1, NULL, 'l' },<br /> { 0, 0, 0, 0},<br />};<br />int main(int argc, char *argv[])<br />{<br /> int c;<br /> while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1)<br /> {<br /> switch (c)<br /> {<br /> case 'n':<br /> printf("My name is XL./n");<br /> break;<br /> case 'b':<br /> printf("His name is ST./n");<br /> break;<br /> case 'l':<br /> l_opt_arg = optarg;<br /> printf("Our love is %s!/n", l_opt_arg);<br /> break;<br /> }<br /> }<br /> return 0;<br />}

編譯並運行:

[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!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.