1. 规范
根据规范,我们使用 - 表示 option,option后面可以加关联值arg
wc -l
为了遵守该规则,linux提供了getopt getopt_long函数
2. getopt
int getopt(int argc, char * const argv[],
const char *optstring);
- 参数说明
argc 和 argv 用于输入数据。
optstring 用于 说明 哪些选项可用,以及是否有关联值。
optstring 是一个字符列表,每个字符代表一个单字符选项,如果一个字符紧跟一个冒号,则表明该选项有一个关联值参数。
getopt(argc, argv, "if:lr");
上面说明,有选项: -i -l -r -f ,其中-f后要紧跟一个文件名参数。
- 返回值
返回下一个选项字符(如果存在):getopt返回值是argv数组中的下一个选项字符(如果有的话)。循环调用getopt就可以依次得到每个选项。
返回-1:若处理完毕
返回? : 若遇到一个无法识别的选项,并将其保存到外部变量optopt中
若选项要求关联值,但是用户未提供,则返回? - 外部变量
optarg: 若选项有关联值,则optarg指向这个值
optopt: 若遇到无法识别的选项,则将其保存在外部变量optopt
optind: 被设置为下一个待处理参数的索引,getopt用它来记录自己的进度,用户程序很少需要该变量
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int opt;
while ((opt = getopt(argc, argv, "if:lr")) != -1) {
switch (opt) {
case ‘i‘:
case ‘l‘:
case ‘r‘:
printf("option : %c\n", opt);
break;
case ‘f‘:
printf("filename : %s\n", optarg);
break;
case ‘:‘:
printf("option needs a value\n");
break;
case ‘?‘:
printf("unknow option : %c\n", optopt);
break;
}
}
for (; optind < argc; optind++) {
printf("remaining arguments : %s\n", argv[optind]);
}
return 0;
}
[root@VM-0-12-centos test]# ./a.out -i -f ./test.c -f asdf asdf
option : i
filename : ./test.c
filename : asdf
argument : asdf
3. getopt_long
getopt_long接受 双划线(--)的长参数,更明确 参数含义
如
./longopt --init --list ‘hi there‘ --file fred.c -q
option: i
option: l
filename: fred.c
./longopt: invaild option -- q
unknown option: q
argument: hi there
长选项可以缩写,关联选项可以用--option=value
./longopt --init -l --file=fred.c ‘hi there‘
option i
option l
filename: fred.c
argument: hi there
int getopt_long(int argc, char * const argv[],
const char *optstring,
const struct option *longopts, int *longindex);
int getopt_long_only(int argc, char * const argv[],
const char *optstring,
const struct option *longopts, int *longindex);
getopt_long 大部分参数和getopt一样,只是多了两个参数:
@longopts : 描述长选项
@longindex: 作为optind长选项版本使用
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
@name : 长选项的名称
@has_arg : 该选项是否带参数,0表示不带,1表示必须带,2表示可选参数
@flag : 设置为NULL表示找到该选项时,getopt_long返回在成员val里给出的值,否则getopt_long返回0,并将val值写入flag指向的变量
@val : getopt_long 为该选项返回的值
#include <stdio.h>
#include <unistd.h>
#define _GNU_SOURCE
#include <getopt.h>
int main(int argc, char *argv[])
{
int opt;
struct option longopts[] = {
{"init", 0, NULL, ‘i‘},
{"file", 1, NULL, ‘f‘},
{"list", 0, NULL, ‘l‘},
{"restart", 0, NULL, ‘r‘},
{0,0,0,0}
};
while ( (opt = getopt_long(argc, argv, ":if:lr", longopts, NULL)) != -1) {
switch (opt) {
case ‘i‘:
case ‘l‘:
case ‘r‘:
printf("option : %c\n", opt);
break;
case ‘f‘:
printf("filename : %s\n", optarg);
break;
case ‘:‘:
printf("option needs a value\n");
break;
case ‘?‘:
printf("unknown option : %c\n", optopt);
break;
}
}
for (; optind < argc; optind++) {
printf("remaining argument : %s\n", argv[optind]);
}
return 0;
}