如何在c命令行工具中使用命令行选项?

时间:2015-12-28 03:15:27

标签: c

我试图了解如何使用命令行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;

2 个答案:

答案 0 :(得分:2)

getopt()有许多手册页,包括POSIX规范。它们描述了getopt()函数的作用。您还可以阅读POSIX Utility Conventions,它描述了大多数程序如何处理参数(但是规则有很多例外,通常是因为历史上的POSIX之前的先例)。

在示例大纲代码中,-e选项接受一个参数,即示例命令行中的4。你可以告诉因为e:的第三个参数中的getopt()(字母后面的冒号表示该选项带有参数)。 -a选项不带参数;你可以告诉,因为在getopt()的第三个参数中没有后跟冒号。选项处理完成后,名称BrasiliaTokyoLondon是非选项参数。在循环外的两个复合赋值之后,它们是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>