在linux系统上,服务的运行常以命令行的方式进行,命令行的方式又会跟上参数,比如著名的开源软件memcached,在服务器上运行这个服务时,往往需要添加上很多个参数以指定服务的配置。我们常见的命令行跟参数的格式有以下两种:
exe -h -h 主机名 -p 端口号
exe --help --version --host=主机名 --port==端口
解析第一种格式的命令行参数:这一种只能针对短选项进行解析
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> //getopt
int main(int argc, char *argv[])
{
if (argc < 8) {
printf("Usage: exe -u user -h host -p port -r");
exit(-1);
}
char *user, *host, *port;
char c;
while (-1 != (c = getopt(argc, argv,
"u:" //user 冒号表示该选项需要 指明参数,参数通过optarg返回,不需要自行设定,头文件中已经包含
"h:" //host
"p:" //port
"r" //print something
))) {
switch(c) {
case 'u':
user = strdup(optarg);
break;
case 'h':
host = strdup(optarg);
break;
case 'p':
port = strdup(optarg);
break;
case 'r':
printf("arg r");
break;
default:
break;
}
}
printf("user: %s, host: %s, port: %s\n", user, host, port);
return 0;
}
针对第二种长选项的解析,长选项的解析同时也能够简化为短选项,所以下面的命令行解析是通用的:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <getopt.h>
int main(int argc, char *argv[])
{
const char *shotOptions = "u:h:p:v"; //短选项设定,冒号表示该选项需要跟参数
struct option longOptions[] = { //长选项结构体
{"user", 1, NULL, 'u'}, //第一个参数表示长选项名称,第二个参数表示是否跟参数,0:不跟,1:跟,2:可带也可不带,第三个参数通常设为NULL,第四个参数可理解为与长选项对应的短选项
{"host", 1, NULL, 'h'},
{"port", 1, NULL, 'p'},
{"version", 0, NULL, 'v'},
{0, 0, 0, 0}
};
char opt;
char *user, *host, *port;
while (-1 != (opt = getopt_long(argc, argv, shotOptions, longOptions, NULL))) {
switch(opt) {
case 'u':
user = strdup(optarg);
break;
case 'h':
host = strdup(optarg);
break;
case 'p':
port = strdup(optarg);
break;
case 'v':
printf("version\n");
break;
default:
break;
}
}
printf("user: %s, host: %s, port: %s\n", user, host, port);
return 0;
}
对于长选项的命令行参数则可以这样指定:./exe --user my --host=192.168.12.21 -p 21211
可以看到长选项实际上包含了对于短选项的解析,所以第二种的命令行解析是常用的。