linux 中解析命令列引數 (getopt_long用法)
getopt_long支援長選項的命令列解析,使用man getopt_long,得到其宣告如下:
#include
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:選項名,前面沒有短橫線。譬如"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,即。下面舉例說明,還是按照短選項為『-h』『-o』
『-v』的例子,該資料結構可以定義成如下形式:
const struct option long_options = ,,,
};(2)呼叫方法
參照(1)準備的兩個資料結構,則呼叫方式可為:
getopt_long( argc, argv, short_options, long_options, null);
(3)幾種常見返回值
(a)每次呼叫該函式,它都會分析乙個選項,並且返回它的短選項,如果分析完畢,即已經沒有選項了,
則會返回-1。
(b)如果getopt_long()在分析選項時,遇到乙個沒有定義過的選項,則返回值為『?』,此時,程式設計師可
以列印出所定義命令列的使用資訊給使用者。
(c)當處理乙個帶引數的選項時,全域性變數optarg會指向它的引數
(d)當函式分析完所有引數時,全域性變數optind(into argv)會指向第乙個『非選項』的位置
實踐小例子:
view plain
copy to clipboard
print?
#include
#include
char *l_opt_arg;
char* const short_options = "nbl:";
struct option long_options = ,
, ,
, };
int main(int argc, char *argv)
} 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!
LINUX中解析命令列引數
author liujun time 2013 3 18 在linux中你輸入比如 insert ll kk mm qq 你如何得到ll kk mm qq,這是需要用到命令列的解析,來分離字串。有三種方法 第一 getopt long支援長選項的命令列解析,使用man getopt long,得到其...
解析命令列引數
include include include include int make argv const char astr,const char delimiters,char argvp void free argv char argvp int main int argc,char argv i...
linux解析命令列引數getopt long
直接啟動nginx,其實linux上其實提供了解析命令列引數的函式getopt long 標頭檔案getopt.h 特別容易使用,這些都是在webbench乙個開源專案中get到的。include include include int clients 1 int force 0 static co...