日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux 中解析命令行参数 (getopt_long用法)

發(fā)布時(shí)間:2025/3/20 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 中解析命令行参数 (getopt_long用法) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

getopt_long支持長(zhǎng)選項(xiàng)的命令行解析,使用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);

說(shuō)明:函數(shù)中的argc和argv通常直接從main()到兩個(gè)參數(shù)傳遞而來(lái)。optsting是選項(xiàng)參數(shù)組成的字符串,如果該字符串里任一字母后有冒號(hào),那么這個(gè)選項(xiàng)就要求有參數(shù)。下一個(gè)參數(shù)是指向數(shù)組的指針,這個(gè)數(shù)組是option結(jié)構(gòu)數(shù)組,option結(jié)構(gòu)稱為長(zhǎng)選項(xiàng)表,其聲明如下:

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

結(jié)構(gòu)中的元素解釋如下:
const char *name:選項(xiàng)名,前面沒(méi)有短橫線。譬如"help"、"verbose"之類。
int has_arg:描述長(zhǎng)選項(xiàng)是否有選項(xiàng)參數(shù),如果有,是哪種類型的參數(shù),其值見下表:
符號(hào)常量???????????? 數(shù)值??????????? 含義
no_argument??????????? 0??????????? 選項(xiàng)沒(méi)有參數(shù)
required_argument????? 1??????????? 選項(xiàng)需要參數(shù)
optional_argument????? 2??????????? 選項(xiàng)參數(shù)是可選的
int *flag:
如果該指針為NULL,那么getopt_long返回val字段的值;
如果該指針不為NULL,那么會(huì)使得它所指向的結(jié)構(gòu)填入val字段的值,同時(shí)getopt_long返回0
int val:
如果flag是NULL,那么val通常是個(gè)字符常量,如果短選項(xiàng)和長(zhǎng)選項(xiàng)一致,那么該字符就應(yīng)該與optstring中出現(xiàn)的這個(gè)選項(xiàng)的參數(shù)相同;

最后一個(gè)參數(shù):longindex參數(shù)一般賦為NULL即可;如果沒(méi)有設(shè)置為NULL,那么它就指向一個(gè)變量,這個(gè)變量會(huì)被賦值為尋找到的長(zhǎng)選項(xiàng)在longopts中的索引值,這可以用于錯(cuò)誤診斷。

注:GNU提供的getopt-long()和getopt-long-only()函數(shù),其中,后者的長(zhǎng)選項(xiàng)字串是以一個(gè)短橫線開始的,而非一對(duì)短橫線。

linux 命令行約定:
???? 幾乎所有的GNU/Linux程序都遵循一些命令行參數(shù)定義的約定。程序希望出現(xiàn)的參數(shù)可以分成兩種:選項(xiàng)(options or flags)、其他類型的的參數(shù)。Options修飾了程序運(yùn)行的方式,其他類型的參數(shù)則提供了輸入(例如,輸入文件的名稱)。

???? 對(duì)于options類型參數(shù)可以有兩種方式:
???? 1)短選項(xiàng)(short options):顧名思義,就是短小參數(shù)。它們通常包含一個(gè)連字號(hào)和一個(gè)字母(大寫或小寫字母)。例如:-s,-h等。
???? 2)長(zhǎng)選項(xiàng)(long options):長(zhǎng)選項(xiàng),包含了兩個(gè)連字號(hào)和一些大小寫字母組成的單詞。例如,--size,--help等。
???? *注:一個(gè)程序通常會(huì)提供包括short options和long options兩種參數(shù)形式的參數(shù)。

???? 對(duì)于其他類型參數(shù)的說(shuō)明:
???? 這種類型的參數(shù),通常跟隨在options類型參數(shù)之后。例如,ls –s /功能為顯示root目錄的大小。’/’這個(gè)參數(shù)告訴ls要顯示目錄的路徑。


getopt_long()函數(shù)使用規(guī)則:

(1)使用前準(zhǔn)備兩種數(shù)據(jù)結(jié)構(gòu)
??? 字符指針型變量
??? 該數(shù)據(jù)結(jié)構(gòu)包括了所有要定義的短選項(xiàng),每一個(gè)選項(xiàng)都只用單個(gè)字母表示。如果該選項(xiàng)需要參數(shù)(如,需要文件路徑等),則其后跟一個(gè)冒號(hào)。例如,三個(gè)短選項(xiàng)分別為‘-h’‘-o’‘-v’,其中-o需要參數(shù),其他兩個(gè)不需要參數(shù)。那么,我們可以將數(shù)據(jù)結(jié)構(gòu)定義成如下形式:
const char * const shor_options = “ho:v” ;

??? struct option 類型數(shù)組
??? 該數(shù)據(jù)結(jié)構(gòu)中的每個(gè)元素對(duì)應(yīng)了一個(gè)長(zhǎng)選項(xiàng),并且每個(gè)元素是由四個(gè)域組成。通常情況下,可以按以下規(guī)則使用。第一個(gè)元素,描述長(zhǎng)選項(xiàng)的名稱;第二個(gè)選項(xiàng),代表該選項(xiàng)是否需要跟著參數(shù),需要參數(shù)則為1,反之為0;第三個(gè)選項(xiàng),可以賦為NULL;第四個(gè)選項(xiàng),是該長(zhǎng)選項(xiàng)對(duì)應(yīng)的短選項(xiàng)名稱。另外,數(shù)據(jù)結(jié)構(gòu)的最后一個(gè)元素,要求所有域的內(nèi)容均為0,即{NULL,0,NULL,0}。下面舉例說(shuō)明,還是按照短選項(xiàng)為‘-h’‘-o’

‘-v’的例子,該數(shù)據(jù)結(jié)構(gòu)可以定義成如下形式:
const struct option long_options = {
{? “help”,????? 0,?? NULL,?? ‘h’? },
{? “output”,??? 1,?? NULL,?? ‘o’? },
{? “verbose”,?? 0,?? NULL,?? ‘v’? },
{? NULL,????? 0,??? NULL,?? 0? }
};

(2)調(diào)用方法
???? 參照(1)準(zhǔn)備的兩個(gè)數(shù)據(jù)結(jié)構(gòu),則調(diào)用方式可為:
getopt_long( argc, argv, short_options, long_options, NULL);

(3)幾種常見返回值
??? (a)每次調(diào)用該函數(shù),它都會(huì)分析一個(gè)選項(xiàng),并且返回它的短選項(xiàng),如果分析完畢,即已經(jīng)沒(méi)有選項(xiàng)了,

則會(huì)返回-1。
??? (b)如果getopt_long()在分析選項(xiàng)時(shí),遇到一個(gè)沒(méi)有定義過(guò)的選項(xiàng),則返回值為‘?’,此時(shí),程序員可

以打印出所定義命令行的使用信息給用戶。
??? (c)當(dāng)處理一個(gè)帶參數(shù)的選項(xiàng)時(shí),全局變量optarg會(huì)指向它的參數(shù)
??? (d)當(dāng)函數(shù)分析完所有參數(shù)時(shí),全局變量optind(into argv)會(huì)指向第一個(gè)‘非選項(xiàng)’的位置

實(shí)踐小例子:

#include <stdio.h>
#include
<getopt.h>

char *l_opt_arg;
char* const short_options = "nbl:";

struct option long_options[] = {
{
"name", 0, NULL, 'n' },
{
"bf_name", 0, NULL, 'b' },
{
"love", 1, NULL, 'l' },
{
0, 0, 0, 0},
};

int main(int argc, char *argv[])
{
int c;
while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1)
{
switch (c)
{
case 'n':
printf(
"My name is XL.\n");
break;
case 'b':
printf(
"His name is ST.\n");
break;
case 'l':
l_opt_arg
= optarg;
printf(
"Our love is %s!\n", l_opt_arg);
break;
}
}
return 0;
}

  

編譯并運(yùn)行:

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


轉(zhuǎn)自:http://blog.csdn.net/ast_224/article/details/3861625

轉(zhuǎn)載于:https://www.cnblogs.com/hnrainll/archive/2011/09/15/2176933.html

總結(jié)

以上是生活随笔為你收集整理的linux 中解析命令行参数 (getopt_long用法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。