linux命令行参数解析函数----getopt()函数的使用学习

今天在看代码时发现getopt函数的一段代码,从网上找了相关的博客,学会了该函数的基本使用方法。总结记录如下:

1、这个函数在linux命令行下:可以使用man 3 getopt 来查看对该函数的介绍: int getopt(int argc, char * const argv[],
                  const char *optstring);

该函数有三个参数:其中前两个和void main(int argc, char * argv[])中的一样,其实getopt的前两个参数就是接收main函数传递过来的argc(命令行参数的个数)和argv(指向命令行的指针数组),第三个参数是命令字符串。根据man 3 getopt 后面对该函数的解释“If an option was successfully found, then getopt() returns the option character.  If all command-line  options  have  been
       parsed,  then  getopt()  returns  -1
.   If  getopt() encounters an option character that was not in optstring, then '?' is
       returned
.  If getopt() encounters an option with a missing argument, then the return value depends on the first  character
       in optstring: if it is ':', then ':' is returned; otherwise '?' is returned
.”

所以这个函数解析成功之后返回的是选项字符,因为是字符所以可以转成int类型,所以函数返回值是int类型。

2、在man 3  getopt 对该函数的解释那还有extern char *optarg; extern int optind, opterr, optopt;这几个参数跟这个函数关系是十分密切的:optarg是用来保存选项的参数;optind用来保存下一次要索引的字符串的索引值;opterr表示是否将错误信息输出到stderr,如果是0表示不输出,否则输出,默认是1;optopt表示输入的选项不再optstring中的选项。

3、讲到这有人可能还不明白什么是命令选项:gcc  test.c -o app 这个命令中,-o就叫命令选项,app就是这个选项的参数。这个命令行选项是可以一起的:比如 rm app -rf;当两个命令后面都不带参数时时可以写在一起的。

4、这里我们重点介绍getopt函数的第三个参数:optstring,看名字时选项字符串的意思。我们根据例子讲解这个参数的使用“nb:o:t”,这个选项字符串如果是这样,那么在命令行输入的时候就要-n、-b、-o、-t这样输入。其中一个“”表示这个选项后面必须跟一个参数,这个参数可以直接和命令选项写在一起,也可以用空格隔开;"::"两个冒号表示该命令选项后面的参数可以带也可以不带,如果带参数的话,命令和参数之间不能有空格。(!!!!!!!!!!!!!!)

用一个例子说明以上的讲解:

int main(int argc,char *argv[])
{
    int opt=-1;
    
    while((opt=getopt(argc,argv,"nb:o::t"))!=-1)
    {
        printf("opt=%c,optarg=%s,optind=%d,argv[optind]=%s.optopt=%c\n",
        opt,optarg,optind,argv[optind],optopt);
    }

    return 0;
}

生成的应用程序是app.

(1)./app  -x -y -z 就会输出错误信息如下:

 ./app: invalid option -- 'x'
opt=?,optarg=(null),optind=2,argv[optind]=-y.
./app: invalid option -- 'y'
opt=?,optarg=(null),optind=3,argv[optind]=-z.
./app: invalid option -- 'z'
opt=?,optarg=(null),optind=4,argv[optind]=(null).

(2) ./app -n -b 123 -o -t

opt=n,optarg=(null),optind=2,argv[optind]=-b.
opt=b,optarg=123,optind=4,argv[optind]=-o.
opt=o,optarg=(null),optind=5,argv[optind]=-t.
opt=t,optarg=(null),optind=6,argv[optind]=(null).

(3)如果-n后面带参数的话,那么会报错:

./app -n12 -b 3 -o -t
opt=n,optarg=(null),optind=1,argv[optind]=-n12.
./app: invalid option -- '1'
opt=?,optarg=(null),optind=1,argv[optind]=-n12.

./app: invalid option -- '2'
opt=?,optarg=(null),optind=2,argv[optind]=-b.
opt=b,optarg=3,optind=4,argv[optind]=-o.
opt=o,optarg=(null),optind=5,argv[optind]=-t.
opt=t,optarg=(null),optind=6,argv[optind]=(null).

(4)如果双冒号的选项后面带参数用空格隔开的话:

./app -n -b 123 -o 456 -t
opt=n,optarg=(null),optind=2,argv[optind]=-b.
opt=b,optarg=123,optind=4,argv[optind]=-o.
opt=o,optarg=(null),optind=5,argv[optind]=456.         ---------》红色标记部分正确的话应该是456才对,有空格不能识别。
opt=t,optarg=(null),optind=7,argv[optind]=(null).

(5)双冒号的选项后面带参数不用空格隔开(正确的方式):

./app -n -b 123 -o456 -t
opt=n,optarg=(null),optind=2,argv[optind]=-b.
opt=b,optarg=123,optind=4,argv[optind]=-o456.
opt=o,optarg=456,optind=5,argv[optind]=-t.
opt=t,optarg=(null),optind=6,argv[optind]=(null).

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值