命令行选项解析相关知识点

最近读源码的时候碰到命令行解析相关的知识点,比较模糊。摘取出来做个记录

1.最基本的main函数头

main(int argc,char *argv[ ])

如果只输入程序名xxx,则argc=1argv[0]指向输入的程序路径及名称./xxx;如果输入xxx para_1(程序名加一个参数),则argc=2argv[0] 指向输入的程序路径及名称,argv[0]指向参数para_1字符串以此类推,也就是char  *argv[]:argv 是一个指针数组,元素个数是argc,存放的是指向每一个参数的指针

2.getopt_long()函数

示例:

while ((c = getopt_long (argc, argv, "i:o:c:m:t:h", longOpts, &longIndex)) != -1) {
      switch (c) {
      case 'i':
        inputfilename = optarg;
        break;
      case 'o':
        outputfilename = optarg;
        break;
}

getopt_long()用于解析命令行选项参数,所在的头文件是#include<getopt.h>。

代码的原型:

getopt_long(int argc, char * const argv[], const char *optstring,const struct option *longopts, int*longindex)

接下来我们来分析一下各个参数表示的含义:

argc&argv:同上
optstring:选项字符串,表示可以处理哪个选项以及哪个选项需要参数。其中举例,如ab:c::则表示a没有参数,b一定要有参数,c可有可不有参数。在命令行的输入为-a -b 20 -c (10)
longopts:长参数的名称和属性
longindex:如果longindex非空,指向的变量将记录当前找到参数符合longopts里的第几个元素的描述,即是longopts的下标值

 那么对于本示例中的optstring"i:o:c:m:t:h"则表示除了-h没有参数,别的都一定有参数。

函数的返回值:

对于短选项,如果成功找到,返回选项字母;如果所有命令行选项都解析完毕,返回 -1;如果遇到选项字符不在 optstring 中,返回字符 '?';如果遇到丢失参数,那么返回值依赖于 optstring 中第一个字符,如果第一个字符是 ':' 则返回':',否则返回'?'并提示出错误信息。对于长选项,如果flag是NULL,返回val,否则返回0
所以示例中while(c!=-1),因为=-1时解析就已经完毕了。那么optarg又是啥呢?(解析每一个选项时返回的内容)
optarg:指向当前选项参数(如果有)的指针。如果输入-i "test.txt"那么此时optarg="test.txt";如果输入-h那么此时optarg="null"
optind:下一个argv指针的索引,以0为开始
optopt:存储出错的option(如缺参数),或者不认识的option
opterr:控制是否向STDERR打印错误。如果不需要,则只要将全域变量opterr设为0即可。

3.命令行中--和-的区别

转自:https://www.zhihu.com/question/267095526/answer/319387178

简单来说,「-」和「--」是两种不同的命令行选项的风格。前者是传统的Unix风格的,后者是GNU风格的。

具体点来讲,起初Unix设计命令行程序时,需要将一个命令的『选项』(Options)和『参数』(Arguments)区分开来,就引入了「-」。

凡是以「-」开头的,就是选项。选项用一个单独的字母作为标志,通常也是一个选项英语的缩写。

例如,「-a」表示所有(all),「-c」表示命令(command),「-f」表示文件(file),「-V」表示版本(version)。

多个选项也可以连写,如「ls -A -l」可以写成「ls -Al」。

但是,单独字母的数量毕竟有限,会不够用,而且表达的意思不够明确。

于是就有了之后的GNU风格来完善上述的不足,使用「--」作为前缀,后面可以跟一串单词,如「--version」,「--all」。

选项自己的参数即可以放在后面用空格隔开,可以使用「=」,如「--file foobar.out」等价于「--file=foobar.out」。

这种GNU风格的选项常被称之为『长选项』(Long Options),而Unix风格的为『短选项』(Short Options)。

通常来说短选项都有与之对应的长选项,如「-a,--all」、「-V,--version」。

猜你喜欢

转载自www.cnblogs.com/lyeeer/p/11334138.html
今日推荐