時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
GNU/Linux的命令行選項有兩種類型:短選項和長選項,前者以 '-' 作為前導(dǎo)符,后者以 '--' 作為前導(dǎo)符。比如有一個命令:
$ myprog -a vv --add -b --file a.txt b.txt - -- -e c.txt
在GNU/Linux系統(tǒng),對這種情況的一種合理解釋是:
a是短選項,帶一個參數(shù)vv;
add是長選項,無參數(shù);
b是短選項,無參數(shù);
file是長選項,帶一個參數(shù)a.txt;
b.txt是參數(shù);
-是參數(shù),通常表示標(biāo)準(zhǔn)輸入,stdin;
--是一個指示符,表明停止掃描參數(shù),其后所有部分都是參數(shù),而不是選項;
-e是參數(shù);
c.txt是參數(shù)
為了簡化程序設(shè)計,有幾個庫函數(shù)可以優(yōu)雅地分析命令行參數(shù),原型如下:
#include
int getopt(int argc, char * const argv[],
const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
#define _GNU_SOURCE
#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);
我們先看看用于分析短參數(shù)的getopt函數(shù)。參數(shù)含義如下:
argc, argv是從main函數(shù)獲取的參數(shù),原樣傳給getopt;
optstring指示如何分析參數(shù)。
關(guān)于optstring,還有幾點說明:
如果選項帶參數(shù),該選項后接冒號,比如上例中optstring為"a:b",指示a帶參數(shù),b沒有參數(shù);
如果選項帶可選參數(shù),該選項后接兩個冒號,比如"a::b",表明a可能有參數(shù),也可能沒有;
如果optstring的開頭字符為':',表明如果指明選項帶參數(shù),而實際命令行沒有參數(shù)時,getopt返回':'而不是'?'(默認(rèn)情況下返回'?',和無法識別的參數(shù)返回一樣);
如果optstring的開頭字符為'+',表明一但遇到一個無選項參數(shù),馬上停止掃描,隨后的部分當(dāng)作參數(shù)來解釋;
如果optstring的開頭字符為'-',表明如果遇到無選項參數(shù),則把它當(dāng)作選項1(不是字符'1')的參數(shù)
該函數(shù)每解析完一個選項,就返回該選項字符。
如果選項帶參數(shù),參數(shù)保存在optarg中。如果選項帶可選參數(shù),而實際無參數(shù)時,optarg為NULL。
當(dāng)遇到一個不在optstring指明的選項時,返回字符‘?’。如果在optstring指明某選項帶參數(shù)而實際沒有參數(shù)時,返回字符‘?’或者字符‘:’,視optstring的第一個字符而定。這兩種情況選項的實際值被保存在optopt中。
當(dāng)解析錯誤時,如果opterr為1則自動打印一條錯誤消息(默認(rèn)),否則不打印。
當(dāng)解析完成時,返回-1。
每當(dāng)解析完一個argv,optind就會遞增。如果遇到無選項參數(shù),getopt默認(rèn)會把該參數(shù)調(diào)后一位,接著解析下一個參數(shù)。如果解析完成后還有無選項的參數(shù),則optind指示的是第一個無選項參數(shù)在argv中的索引。
函數(shù)getopt_long()的工作方式類似于getopt(),不過它還能接收長選項。在接收長選項之前,我們必須定義個一個結(jié)構(gòu)體數(shù)組變量longopts,指明我們希望獲取的長選項。
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
含義如下:
name指明長選項的名稱;
has_arg指明該選項是否帶參數(shù),1為是,0為否,2為可選;
flag指明長選項如何返回,如果flag為NULL,則getopt_long返回val。否則返回0,flag指向一個值為val的變量。如果該長選項沒有發(fā)現(xiàn),flag保持不變;
val指明返回的值,或者需要加載到被flag所指示的變量中。
option數(shù)組的最后一個元素必須全部填充0.
getopt_long的最后一個參數(shù)longindex在函數(shù)返回時指向被搜索到的選項在longopts數(shù)組中的下標(biāo)。longindex可以為NULL,表明不需要返回這個值。
getopt_long_only類似于getopt_long,但是它把'-'開頭的選項當(dāng)作長選項來處理。如果該選項與長選項不匹配,而與短選項匹配,則可以作為短選項解析。
在短選項找到的時候,getopt_long和getopt_long_only的表現(xiàn)和getopt一樣。如果長選項找到了,如果flag為 NULL,返回val,否則返回0。錯誤情況的處理和getopt一樣,只是返回'?'時還可能是別的情況引起的:選項含糊不明確或者無關(guān)參數(shù)。
#p#副標(biāo)題#e#
我們拿Linux手冊的一個例子來說事。
#include
#include
#include
int
main (int argc, char **argv) {
int c;
int digit_optind = 0;
while (1) {
int this_option_optind = optind ? optind : 1;
int option_index = 0;
static struct option long_options[] = {
{"add", 1, 0, 0},
{"append", 0, 0, 0},
{"delete", 1, 0, 0},
{"verbose", 0, 0, 0},
{"create", 1, 0, ’c’},
{"file", 1, 0, 0},
{0, 0, 0, 0}
};
c = getopt_long (argc, argv, "abc:d:012",
long_options, &option_index);
if (c == -1)
break;
switch (c) {
case 0:
printf ("option %s", long_options[option_index].name);
if (optarg)
printf (" with arg %s", optarg);
printf ("\n");
break;
case ’0’:
case ’1’:
case ’2’:
if (digit_optind != 0 && digit_optind != this_option_optind)
printf ("digits occur in two different argv-elements.\n");
digit_optind = this_option_optind;
printf ("option %c\n", c);
break;
case ’a’:
printf ("option a\n");
break;
case ’b’:
printf ("option b\n");
break;
case ’c’:
printf ("option c with value ‘%s’\n", optarg);
break;
case ’d’:
printf ("option d with value ‘%s’\n", optarg);
break;
case ’?’:
break;
default:
printf ("?? getopt returned character code 0%o ??\n", c);
}
}
if (optind < argc) {
printf ("non-option ARGV-elements: ");
while (optind < argc)
printf ("%s ", argv[optind++]);
printf ("\n");
}
exit (0);
}
我們用digit_optind和this_option_optind來跟蹤選項012是否在一起,比如選項 -012 和-0 -1 -2 的optind情況是不一樣的,前者返回0、1、2時optind相同,而后者optind的值依次大1。
關(guān)鍵詞標(biāo)簽:linux命令行
相關(guān)閱讀
熱門文章 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 Tomcat9.0如何安裝_Tomcat9.0環(huán)境變量配置方法 多種操作系統(tǒng)NTP客戶端配置 Linux操作系統(tǒng)修改IP
人氣排行 Linux下獲取CPUID、硬盤序列號與MAC地址 dmidecode命令查看內(nèi)存型號 linux tc實現(xiàn)ip流量限制 安裝紅帽子RedHat Linux9.0操作系統(tǒng)教程 linux下解壓rar文件 lcx.exe、nc.exe、sc.exe入侵中的使用方法 Ubuntu linux 關(guān)機(jī)、重啟、注銷 命令 查看linux服務(wù)器硬盤IO讀寫負(fù)載