我试图了解如何使用命令行c工具使用命令行选项,我来到这个例子。可以解释代码流如何工作,我无法理解它,我也理解它使用内置的getopt()函数。
调用的exe是rocket_to,它有两个命令行选项,e和a。 e选项以4为参数,选项以Brasalia,Tokyo,London为参数。
有人可以解释代码是如何工作的吗?
这是实际代码:
命令行:
rocket_to -e 4 -a Brasalia Tokyo London
代码:
#include<unistd.h>
..
while((ch=getopt(argc,argv,"ae:"))!=EOF)
switch(ch){
..
case 'e':
engine_count=optarg;
..
}
argc -=optind;
argv +=optind;
答案 0 :(得分:2)
getopt()
有许多手册页,包括POSIX规范。它们描述了getopt()
函数的作用。您还可以阅读POSIX Utility Conventions,它描述了大多数程序如何处理参数(但是规则有很多例外,通常是因为历史上的POSIX之前的先例)。
在示例大纲代码中,-e
选项接受一个参数,即示例命令行中的4
。你可以告诉因为e:
的第三个参数中的getopt()
(字母后面的冒号表示该选项带有参数)。 -a
选项不带参数;你可以告诉,因为在getopt()
的第三个参数中没有后跟冒号。选项处理完成后,名称Brasilia
,Tokyo
,London
是非选项参数。在循环外的两个复合赋值之后,它们是argv[0]
.. argv[argc-1]
中的值。
EOF
的使用不正确;当没有更多选项可供处理时,getopt()
会返回-1
。您无需包含<stdio.h>
即可使用getopt()
。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int ch;
int aflag = 0;
char *engine_count = "0";
while ((ch = getopt(argc, argv, "ae:")) != -1)
{
switch (ch)
{
case 'a':
aflag = 1;
break;
case 'e':
engine_count = optarg;
break;
default:
fprintf(stderr, "Usage: %s [-a][-e engine] [name ...]\n", argv[0]);
exit(EXIT_FAILURE);
}
}
argc -= optind;
argv += optind;
printf("A flag = %d\n", aflag);
printf("Engine = %s\n", engine_count);
for (int i = 0; i < argc; i++)
printf("argv[%d] = %s\n", i, argv[i]);
return 0;
}
这是工作代码,如果编译为创建程序rocket_to
,则生成:
$ ./rocket_to -e 4 -a Brasilia Tokyo London
A flag = 1
Engine = 4
argv[0] = Brasilia
argv[1] = Tokyo
argv[2] = London
$ ./rocket_to -a -e 4 Brasilia Tokyo London
A flag = 1
Engine = 4
argv[0] = Brasilia
argv[1] = Tokyo
argv[2] = London
$ ./rocket_to -e -a 4 Brasilia Tokyo London
A flag = 0
Engine = -a
argv[0] = 4
argv[1] = Brasilia
argv[2] = Tokyo
argv[3] = London
$
答案 1 :(得分:1)
来自getopt手册页:
getopt()函数解析命令行参数。它的参数argc和argv是传递给的参数count和数组 程序调用的main()函数。 argv的一个元素以' - '开头(并且不完全是“ - ”或“ - ”)是一个选项元素。这个元素的字符(除了最初的' - ')是选项字符。如果重复调用getopt(),它 从每个选项元素中连续返回每个选项字符。
getopt()
的第三个参数是有效选项。如果该选项后跟冒号,则需要参数。可以通过optarg变量访问该参数。所以在你的例子中你有两个选择:'a'不带参数,'e'带参数。
如果getopt()
找到选项,则返回该字符。如果解析了所有选项,则返回-1,如果找到未知选项,则返回-1。
因此,您的代码遍历所有选项并在switch语句中处理它们。
下次当您无法理解此类内容时,请先尝试运行man <unknown function>
。