static const char g_shortopts [] = ":d:vh";
static void usage(FILE *fp, int argc, char **argv) {
fprintf(fp,
"Usage: %s [options]\n\n"
"Options:\n"
" -d | --device Device \n"
" -v | --version Display version information\n"
" -h | --help Show help content\n\n"
"", basename(argv[0]));
}
while ((c = getopt_long(argc, argv, g_shortopts, g_longopts, NULL)) != -1) {
switch (c) {
case 'd':
dev = optarg;
break;
case 'v':
/* Display the version */
printf("version : 1.0\n");
break;
case 'h':
usage(stdout, argc, argv);
break;
default :
flag = 1;
break;
}
}
optind初始值为1
①如果命令行指令正确
1.命令行指令不带参数,则optind为不带参数指令的索引值,在循环getopt函数中会一直加1至到最后一个指令,例如./test -h -h -h,optind索引值为2,3,4.
2.命令行指令带参数,则optind为指令参数的索引值,在循环getopt函数中会一直加到最后一个指令,例如./test -d 1 -d 2 -d 3,optind索引值为3,5,7.
②如果命令行指令错误
1.命令行指令是不带'-'指令,则optind不变,改变argv字符串数组内变量顺序,argv[0]被指令取代,例如./test 1 2 3 4,optind索引值为1,,结束后会将optind重新赋值为1,argv字符串数组为{"1","2","3","4"}
2.命令行指令是带'-'指令,则optind会加1,在循环getopt函数中会一直加1至到最后一个参数,例如./test -a -b -c -d,optind索引值为2,3,4,5.
3.命令行指令带'-'指令和不带'-'指令混杂,在循环getopt函数中会跳过不带'-'的指令,并且循环结束后改变optind为去除不带'-'指令的个数,并改变argv字符串数组内变量顺序,将带'-'参数按顺序提前,不带'-'参数按顺序推后,例如./test -a 1 -b 2 -c 3,optind索引值为2,4,6,结束后会将optind重新赋值为4,并且argv字符串数组为{"./test","-a","-b","-c","1","2","3"}
③如果命令行指令正确和错误混杂
1.命令行指令中错误指令只有不带'-'参数,与②的1结果一致,例如./test 1 -d 2 4 -d 3,optind索引值为4,7,结束后会将optind重新赋值为5,argv字符串数组为{"-d","2","-d","3","1","4"}
2.命令行指令中错误指令存在带'-'参数,与②的3结果一致
总结规律:
1.optind,不带'-'指令跳过,带'-'指令不带参数则加1,带'-'指令且带参数则加2
2.argv字符串数组变量顺序,只有不带'-'错误指令和不带'-'错误指令和正确指令混杂时argv[0]被指令取代;命令行指令带'-'指令和不带'-'指令混杂时,将带'-'参数按顺序提前,不带'-'参数按顺序推后