linux命令行|参数解析|同时传入多个参数

linux命令行多个参数值解析方法

使用背景

如下命令行:

./test -a 123  --command 11 22 33 -f filename

一个简单的小应用程序,需要传入多个参数,有的参数甚至需要带有多个参数值
如何通过 getopt_long来获取需要多个参数值。

API介绍

getopt_long 函数原型:

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

常规用法可以看这位大佬写的:
常规用法

实现传入多个参数

循环调用getopt_long会遍历所有的输出的参数,与传进去的longopts列表对比。

返回负数的时候,表示已经遍历完了或者出错了。

所以循环调用,直到返回负数之后break出来

每次调用,switch传入的参数,即可实现传入多个参数。

循环的示例
 while (1) {
        opt = getopt_long(argc, argv, "p:", long_options, NULL);
        if (opt < 0)
            break;

        switch (opt) {
            case USER_OPT_1:
            	{break;}           
             case USER_OPT_2:
	            {break;} 
		}
           }
longopts列表示例
static struct option long_options[] = {
       {"command1", required_argument, NULL, USER_OPT_1},
   	    {"command2", required_argument, NUll, USER_OPT_2},
        {0,0,0,0},
	}

实现一个参数传入多个参数值

核心点是optind这个参数,这个参数代传入的argv列表,下一个将要被处理的参数值的下标

./test -a 123  --command 11 22 33 -f filename

在上面的指令中,当处理到 --command这个参数的时候,这个参数对应的参数值是11
optind指的是下一个将要被处理的参数值下标,也就是22的下标
所以当处理到–command的时候

	argv[optind-1]   = 11;
	argv[optind  ]   = 22;
	argv[optind+1]   = 33;
./testoptoptargargv[optind ]
-a12311
–command1122
-ffilenameNUll

传入多个参数值的代码示例

static struct option long_options[] = {
        {"help", required_argument, 0, USER_OPT_HELP},                
        {"test", required_argument, 0, USER_OPT_TEST},        ,
        {0, 0, 0, 0}
};

int main(int argc,char *argv[])
{

    while (1) {
        opt = getopt_long(argc, argv, "p:", long_options, NULL);
        if (opt < 0)
            break;        
        switch (opt) {         
            case USER_OPT_TEST:
            {
                printf("opt_0 = %d\n", atoi( argv[optind - 1]));
                printf("opt_1 = %d\n", atoi( argv[optind    ]));
                printf("opt_2 = %d\n", atoi( argv[optind + 1]));

                printf("opt_4 = %s\n",  argv[optind+2]);

                break;                
            }                     
        }
    }    
    return 0;
}

执行结果

Linux 可执行文件可以通过命令行传入参数,常用的方法有以下两种: 1. 在可执行文件后面直接跟上参数多个参数之间用空格隔开,例如: ``` ./myprogram arg1 arg2 arg3 ``` 在程序中可以使用 `argc` 和 `argv` 两个参数来接收这些参数,其中 `argc` 表示参数个数,`argv` 是一个字符串数组,保存了每个参数的值。比如以下程序可以输出所有传入参数: ```c++ #include <iostream> int main(int argc, char* argv[]) { for (int i = 0; i < argc; i++) { std::cout << "Argument " << i << ": " << argv[i] << std::endl; } return 0; } ``` 2. 使用标志参数,标志参数通常以破折号开头,后面跟参数值,例如: ``` ./myprogram -a arg1 -b arg2 -c ``` 在程序中可以使用 getopt 或 getopt_long 函数来解析这些参数,这两个函数可以帮助程序员方便地处理命令行参数,不过使用它们需要引入头文件 `getopt.h`。以下是使用 getopt 函数处理命令行参数的示例程序: ```c++ #include <iostream> #include <unistd.h> int main(int argc, char* argv[]) { int opt; while ((opt = getopt(argc, argv, "abc:")) != -1) { switch (opt) { case 'a': std::cout << "-a parameter was passed." << std::endl; break; case 'b': std::cout << "-b parameter was passed." << std::endl; break; case 'c': std::cout << "-c parameter was passed with value " << optarg << std::endl; break; default: std::cout << "Unknown parameter " << opt << std::endl; return 1; } } return 0; } ``` 在命令行中使用 `-a`、`-b`、`-c` 参数参数,其中 `-c` 后面的参数值可以在程序中使用 optarg 变量获取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值