linux getopt long,Linux命令行参数解析——getopt_long

在linux中,一切皆文件,所有的可执行程序都可以通过命令行启动,程序启动时通常都会带上各种参数以控制程序的行为。所以解析命令行参数通常是一个可执行程序的第一步,下面就来介绍下经常用到的命令行参数的解析函数——getopt_long。

我们先来了解一下命令行参数。命令行参数可以分为两类,一类是短选项,一类是长选项。在命令行中"-"表示短选项,"--"则表示长选项。例如,在linux中最常用的ls命令中“-a,-A,-b”都是短选项,而它们对应的长选项则是“--all,--almost-all, --escape”。它们还都可选择性的添加额外参数,比如“--block-size=SIZE”。

getopt_long支持处理长短选项的命令行解析,函数在头文件中。其函数定义是:int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);

接下来介绍一下其参数以及返回值。argc和argv和main函数的两个参数一致。

optstring: 表示短选项字符串。

形式如“a“,分别表示程序支持的命令行短选项有-a、-b、-c、-d,冒号含义如下:

1. 只有一个字符,不带冒号——只表示选项, 如-c。

2. 一个字符,后接一个冒号——表示选项后面带一个参数,如-a 100。

3. 一个字符,后接两个冒号——表示选项后面带一个可选参数,即参数可有可无, 如果带参数,则选项与参数之间不能有空格,如-b123。longopts:表示长选项结构体。其结构以及解释如下:struct option {

const char *name;// 表示的是长选项名称

int has_arg;// 表示选项后面是否携带参数。有3个值。

// no_argument(或者是0),参数后面不跟参数值。

// required_argument(或者是1),参数输入格式为:--参数 值 或者 --参数=值。

// optional_argument(或者是2),参数输入格式只能为:--参数=值。

int *flag;//用来决定函数的返回值。如果flag是null,则函数会返回与该项option匹配的val值,如果flag不是null,则函数返回0,并将flag指针参数指向与该项option匹配的val值。

int val; //和flag联合决定返回值

}longindex:longindex不是null的话则指向的变量将记录longopts的下标值。

返回值:如果短选项找到,那么将返回短选项对应的字符。

如果长选项找到,且flag为null,返回val,flag不为null,返回0。

如果发生错误,如:未识别选项或者必须加参数的选项丢失参数,返回“?”,如果在optstring中设置了第一个字符为“:”,丢失参数返回“:”。

当缩写长选项引起歧义时或者不需要的选项强加了参数,都会返回“?”。

返回-1表示选项处理全部结束。

如果在输入的argv[]中包含了独立的“--”字符串,解析到这里返回-1,停止选项的解析。

还有一些需要了解的全局变量:optarg(指针):表示当前选项对应的参数值。

optind:表示的是下一个将被处理到的参数在argv中的下标值。

opterr:如果opterr = 0,遇到错误将不会输出错误信息到标准输出流。opterr在非0时,向屏幕输出错误。

optopt:表示出错或者未识别的选项。

注意事项:longopts的最后一个元素必须是全0填充,否则会报段错误

短选项中每个选项都是唯一的。而长选项如果简写,也需要保持唯一性。

下面是一个简单的例子:/* 程序运行参数结构体 */

struct InputArgs

{

std::string user_id;

std::string user_name;

std::string pwd;

void printArgs();

bool checkArgs()

{

if (user_id.empty())

{

return false;

}

if (user_name.empty())

{

return false;

}

if (pwd.empty())

{

return false;

}

return true;

}

};

InputArgs g_input_arg_info;

void InputArgs::printArgs(){

printf("ARGS: --= %s\n", userId.c_str());

printf(" --userName = %s\n", user_name.c_str());

printf(" --pwd = %s\n", pwd.c_str());

}

/* 参数解析 */

const char* short_options = "i:n:p:";

struct option long_options[] = {

{ "userId", required_argument, NULL, 'i' },

{ "userName", required_argument, NULL, 'n' },

{ "pwd", required_argument, NULL, 'p' },

{ 0, 0, 0, 0 },

};

void print_usage(){

printf("DESCRIPTION\n");

printf(" --userId, -i\n");

printf(" --userName, -n\n");

printf(" --pwd, -p\n");

}

void print_arg(int argc, char *argv[])

{

for (int i = 0; i < argc; i++)

{

printf("%s\n", argv[i]);

}

}

int parse_arg(int argc, char *argv[])

{

print_arg(argc, argv);

int c;

std::string opt;

while ((c = getopt_long(argc, argv, short_options, long_options, NULL)) !=

-1)

{

switch (c)

{

case 'i':

opt = optarg;

g_input_arg_info.user_id = opt;

break;

case 'n':

opt = optarg;

g_input_arg_info.user_name = opt;

break;

case 'p':

opt = optarg;

g_input_arg_info.pwd = opt;

break;

default:

return -1;

}

}

if (false == g_input_arg_info.checkArgs())

{

return -2;

}

return 0;

}

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

{

if (0 != parse_arg(argc, argv))

{

print_usage();

printf("parse input args failed!\n");

return 1;

}

g_input_arg_info.printArgs();

// do things here

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`getopt_long` 是一个 C 语言的函数,用于解析命令行参数。与传统的 `getopt` 函数不同,`getopt_long` 支持长选项(如 --help)和短选项(如 -h)。 下面是 `getopt_long` 的基本用法: ```c #include <stdio.h> #include <stdlib.h> #include <getopt.h> int main(int argc, char *argv[]) { int c; int digit_optind = 0; while (1) { int option_index = 0; static struct option long_options[] = { {"add", required_argument, 0, 0 }, {"append", no_argument, 0, 0 }, {"delete", required_argument, 0, 0 }, {"verbose", no_argument, 0, 0 }, {"create", required_argument, 0, 'c'}, {"file", required_argument, 0, 0 }, {0, 0, 0, 0 } }; c = getopt_long(argc, argv, "abc:d:012", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf("option %s", long_options[option_index].name); if (optarg) printf(" with arg %s", optarg); printf("\n"); break; case '0': case '1': case '2': if (digit_optind != 0 && digit_optind != optind) printf("digits occur in two different argv-elements.\n"); digit_optind = optind; printf("option %c\n", c); break; case 'a': printf("option a\n"); break; case 'b': printf("option b\n"); break; case 'c': printf("option c with value '%s'\n", optarg); break; case 'd': printf("option d with value '%s'\n", optarg); break; case '?': break; default: printf("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf("non-option ARGV-elements: "); while (optind < argc) printf("%s ", argv[optind++]); printf("\n"); } exit(EXIT_SUCCESS); } ``` 上面的代码演示了 `getopt_long` 的基本用法。其中 `long_options` 数组定义了长选项的名称、参数类型以及对应的短选项(如果有的话)。在调用 `getopt_long` 函数时,第三个参数为短选项字符串,其中冒号表示该选项需要参数。 函数返回值为下一个选项的字符编码,或者 -1 表示已经解析完所有选项。如果选项需要参数,则该参数存储在全局变量 `optarg` 中。 更多关于 `getopt_long` 的用法,可以参考其官方文档:http://man7.org/linux/man-pages/man3/getopt_long.3.html

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值