- #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);
- printf("optind:%d\n", optind);
- printf(">>>>>>>>>>>>>>>>>>>>>\n");
- opterr = 1;
- while ((ch = getopt(argc, argv, "a:b::cde")) != -1) {
-
- 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);
- }
函数说明:
- #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[]中的所有选项被解析出。