在linux中,经常需要各种命令,通常情况下都会带各种参数,而这些参数是如何解析的呢?
通常使用GNU C提供的函数getopt、getopt_long、getopt_long_only函数来解析命令行参数。
使用他们需要引用头文件getopt.h。
原文地址:https://www.cnblogs.com/NickQ/p/11368656.html
getopt()用来解析命令行选项参数的,但是只能解析短选项: -d 100,不能解析长选项:--prefix;其原型:
int getopt(int argc, char * const argv[],const char *optstring);
argc和argv和main函数的两个参数一致,分别表示命令行参数个数和保存参数的字符串数组;
optstring,是短选项的规则声明,形式如"a:b::cd:"
,分别表示程序支持的命令行短选项有-a、-b、-c、-d,冒号含义如下:
:a:b::cd:
的optstring,其第一个字符是冒号表示如果参数解析过程中,出现参数丢失的情况,则返回值返回":",而不是"?"。方便后续程序区别是选项出错还是参数出错;解析的原则根据函数返回值,循环调用该函数,直至该函数将参数解析完毕(返回值为-1).
具体的返回值描述是:
另外,在getopt.h中,也定义如下几个全局变量。
char *optarg —— 指向当前选项参数(如果有参数的话)的指针。ps: 当前选项由返回值传递;
int optind —— 再次调用 getopt() 时的下一个 argv 指针的索引。
int optopt —— 最后一个未知选项。一般当出现未知选项,或缺少参数时,它就会保存这个未知选项。
int opterr -—— 如果不希望getopt()打印出错信息,则只要将该全局变量opterr设为0即可。
getopt_long()是在getopt()的基础上的拓展,可以获取长参数,如获取--help这种参数。其原型如下:
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
同样的,argc和argv和main函数的两个参数一致,分别表示命令行参数个数和保存参数的字符串数组;optstring,是短选项的规则声明;
不同的是getopt_long()有两个解析长参数用到的参数变量;
static struct option longopts[] = {
{"help", no_argument, NULL, 'h'},
{"module", required_argument, NULL, 'm'},
{"set", required_argument, NULL, 's'},
{"get", no_argument, NULL, 'g'},
{"wakelock", required_argument, NULL, 'l'},
{"wakeunlock", required_argument, NULL, 'u'},
{0, 0, 0, 0}
};
这个option结构体,定义如下:
struct option
{
const char *name;//长选项名
int has_arg;//是否需要参数
int *flag;
int val;
};
与 getopt_long 函数使用相同的参数表,在功能上基本一致,只是 getopt_long 只将 --name 当作长参数,但 getopt_long_only 会将 --name 和 -name 两种选项都当作长参数来匹配。如果选项 -name 不能在 longopts 中匹配,但能匹配一个短选项,它就会解析为短选项。
原文:https://www.cnblogs.com/NickQ/p/11368656.html