命令行选项解析相关知识点
Posted lyeeer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了命令行选项解析相关知识点相关的知识,希望对你有一定的参考价值。
最近读源码的时候碰到命令行解析相关的知识点,比较模糊。摘取出来做个记录
1.最基本的main函数头
main(int argc,char *argv[ ])
如果只输入程序名xxx,则argc=1,argv[0]指向输入的程序路径及名称./xxx;如果输入xxx para_1(程序名加一个参数),则argc=2,argv[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」。
以上是关于命令行选项解析相关知识点的主要内容,如果未能解决你的问题,请参考以下文章