linux 命令行参数解析,Linux C下的命令行参数解析

C库中提供了相应的函数接口供用户解析命令行选项,我们常使用的有getopt_long_only和getopt_long,在使用的方法上相差不大。

命令行选项中一般可以选择传递长选项和短选项

长选项的用法为: ./a.out --username bryant --help

短选项的用法为: ./a.out -n bryant -h -v

84fd41d72cd4a08d5958f4eae44870ff.png

1. 函数接口

函数使用的头文件为 #include

bd1e502ad648f9bf334b19fed258a427.png

2. 参数介绍

? argc、argv : 从main函数传递而来。

? shortopts : 短选项字符串。如“n:v”,短选项字符串不需要"-",而且短选项需要传递参数时,在短选项后面加上":"。

一般使用的时候,定义一个空的shortopts即可。

? longopts : struct option 数组,用于存放长选项参数。

struct option {

const char *name; //长选项名

int has_arg; //是否需要参数

int *flag;

int val;

};

has_arg的值有三种情况。

#define no_argument 0

#define required_argument 1

#define optional_argument 2

? longind : 用于返回长选项在longopts结构体数组中的索引值,用于调试。一般置为NULL。

flag和val两个值相互依赖,主要分两种情况。

(1) flag为NULL时,val值用于确定该长选项,所以需要长选项指定唯一的val值。这里也为长选项和短选项建立了桥梁。

(2) flag不为NULL时,将val值存放到flag所指向的存储空间,用于标识该长选项出现过。

3. 返回值

? 程序中使用短选项,则返回短选项字符,例如传递-n,如果需要参数,则将参数保存在optarg中。!optarg不需要定义,在getopt.h中已经有定义

? 程序中使用长选项,则根据flag和val的值确定。当flag为NULL时,返回val值(val值必须唯一)。当value值等于短 选项的值时,可以使用短选项解析长选项;当flag不为NULL时,则将val值存入flag所指向的存储空间,此时getopt_long返回零。

? 出现未定义的长选项或短选项,则返回?

? 解析完毕,getopt_long返回 -1;

c95e74c15389275c37580c2999accacf.png

{"help", no_argument, 0, 0},

{"h", no_argument, 0, 0},

{0, 0, 0, 0}

};

while ((c = getopt_long_only(argc, argv, optstring, opts, &index)) != -1) {

printf("index = %d, c = %d\n", index, c);

switch (index) {

case 0:

case 1:

printf("username:%s\n", optarg);

break;

case 2:

case 3:

printf("version:1.0.0\n");

break;

case 4:

case 5:

printf("debug:yes\n");

break;

case 6:

case 7:

printf("help:?\n");

break;

default:

printf("other:%d\n", index);

break;

}

}

return 0;

}

如果使用如上的方式是将得到选项(长选项或短选项)在结构体数组中的位置,并将该值存放在index中。在while中判定选项的下标即可,如果需要获得参数中传递的值,则将该值保存到optarg中。

上图的程序编译之后,解析命令行选项如下图:

传递短选项:

657fc59f09be1dcf6ac1f435c2affdae.png

传递长选项:

2992b6fb071c5b4f0860dfa78f59774d.png

长选项短选项混合:

5c6f979b7258a9bcae940d4c254f739c.png

使用这种方式可以得到短选项的字符值,用户通过该值进行判断。

8ee695209d8f5882423f60d2fa97b72f.png

c008bf212039069ccdf9eff3bda21984.png

传递短选项:

b9b18206469904ff7c2d670f8bda8a02.png

传递长选项:

e3f1d66fd197303ba946f483c847de59.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值