所以我搜索了这个问题的答案,所有我能找到的是2年前对同一个问题提出质疑并且从未真正回答过的人(option followed by a option in getopt [where the earlier option was expecting a value])。
目前,我正在编写一个应该接受命令行选项和参数的程序。
该命令应该创建和操作通过命令行提供的存档文件。我正在使用getopt()
。该命令的用法是oscar [options] [archive-file] [member files]
但是有些选项不需要参数。例如'-v'标志代表详细,并且只是导致文件中的其他操作吐出比默认语句更多的打印语句。
这是我使用getopt()的代码:
//declaring some variables to be used by getopt
18 extern char *optarg; //pointer to options that require an argument
19 extern int optind; //index into main()'s argument list (argv[])
20
21 int getOptReturn = 0; //int that stores getopt's return (used to check if it is done parsing)
22 int error = 0; //flag for '?' case if getopt doesn't receive proper input
23
24 //flags for all the options
25 int a_flag, A_flag, v_flag, C_flag, d_flag, e_flag, h_flag,
26 m_flag, o_flag, t_flag, T_flag, E_flag, V_flag, u_flag = 0;
27
28 int i; //for loops index
29
30 char *aname;
31
32 //while parsing options
33 while((getOptReturn = getopt(argc, argv, "a:A:Cd:e:E:hm:otTu:vV")) != -1)
34 {
35 //debugging
36 printf("optind: %d, option: %c, optarg: %s \n", optind, argv[optind], optarg);
37 printf("%d\n", argc);
38
39 //switch options and set appropriate flags
40 switch(getOptReturn)
41 {
42 case 'a':
43 printf("-a option received\n");
44 //turn add flag on
45 a_flag = 1;
46 aname = optarg;
47 printf("argument supplied to -a: %s \n", aname);
48 break;
49 case 'A':
50 printf("-A option received\n");
51 //turn add all flag on
52 A_flag = 1;
53 aname = optarg;
54 printf("argument supplied to -A: %s \n", aname);
55 break;
56 case 'v':
57 printf("-v option received\n");
58 //turn verbose flag on
59 v_flag = 1;
60 printf("verbose flag turned on!\n");
61 break;
现在我遇到的问题是,我传递选项字符的顺序当前很重要。
例如:
如果我使用./oscar -va archive
调用该函数,则代码正常运行,v
导致v标志打开,a
处理为archive
作为参数因为我要求a
在getopt()
内有一个参数。
但是,如果我使用./oscar -av archive
调用该函数,则代码会在a
中读取并指定v
作为其必需参数,而不是将v
作为选项并使用{ {1}}作为archive
的参数。
有什么方法可以告诉a
跳过argv []中的其他选项值,这样我就可以从命令行调用各种组合的函数而不用担心顺序如下: / p>
getopt()
./oscar -avo archive file1 file2 file3...
答案 0 :(得分:2)
根据用户n.m.
的评论,这就是命令行参数应该如何按照POSIX指南的规定运行。
来自他的评论:
“在一个' - '分隔符后面分组时,应该接受一个或多个没有选项参数的选项,后面跟最多一个带选项参数的选项。”
如果您需要我正在寻找的功能,您需要使用getopt为您提供的外部变量:optind
与argc
和argv[]
配对以手动处理更多选项需要参数。
感谢阅读。