#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
extern char *optarg;//保存选项的参数
extern int optind, opterr, optopt;
int ch;
printf("\n\n");
printf("otperr:%d\n", opterr);//是否将错误信息输出到stderr,为0时表示不输出
printf("optind:%d\n", optind);//记录下一个检索位置
printf(">>>>>>>>>>>>>>>>>>>>>\n");
opterr = 1;
while ((ch = getopt(argc, argv, "a:b::cde")) != -1) {//当a没有传入参数时,会执行case '?':
//while ((ch = getopt(argc, argv, ":a:b::cde")) != -1) {//当a没有传入参数时,会执行case ':':
printf("optind:%d\n", optind);
printf("optarg:%s\n", optarg);
printf("ch:%c\n", ch);
switch (ch) {
case 'a':
printf("option a: '%s'\n", optarg);
break;
case 'b':
printf("option b: '%s'\n", optarg);
break;
case 'c':
printf("option c\n");
break;
case 'd':
printf("option d\n");
break;
case 'e':
printf("option e\n");
break;
case ':':
printf("option lost...\n");
break;
case '?':
printf("unknow option :%c\n", ch);
}
}
printf("optopt +%c\n", optopt);//不在选项字符串optstring中的选项。找不到参数的case '?'和缺少选项的case ':'的选项
}
函数说明:
#include <unistd.h> extern char *optarg; extern int optind, opterr, optopt; int getopt(int argc, char * const argv[], const char *optstring);
optarg:选项的参数指针
optind:记录下一个检索位置,在getopt的执行中,每次进入都会更新optind变量,该变量指向下一个argv参数
opterr:是否将错误信息输出到stderr,为0时表示不输出
optopt:当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,该选项存储在optopt中,getopt返回'?’
optstring说明:
"a:b::cde",这就是一个选项字符串。对应到命令行就是-a ,-b ,-c ,-d, -e 。冒号又是什么呢? 冒号表示参数,一个冒号就表示这个选项后面必须带有参数,如果optstring中指定了option需要参数,但在命令行没有参数,那么getopt将返回'?',如果在optstring的第一个字符(或者在第一个字符是+/-之后)是':',那么将返回':',这个参数可以和选项连在一起写,也可以用空格隔开,比如-a123 和-a 123(中间有空格) 都表示123是-a的参数;两个冒号的就表示这个选项的参数是可选的,即可以有参数,也可以没有参数,若有参数,optarg指向该该参数,否则optarg为NULL,但要注意有参数时,参数与选项之间不能有空格(有空格会报错),这一点和一个冒号时是有区别的。
传入的'-'开始的字符被解析为选项,getopt一次执行解析出一个option,如果循环执行,可以将argv中的全部option解析出来,如getopt返回-1,表示argv[]中的所有选项被解析出。