3

如何从命令行参数“ tail -10 ”获取选项-10。getopt 函数找到'1'字符。但是如何访问字符串"10"

如果这可以通过 getopt_long 完成,那么举个例子会有所帮助。谢谢。

4

4 回答 4

3

除非您打算-1将其作为参数的选项,否则0答案是您不打算。getopt仅用于处理符合标准 POSIX 实用程序选项语法的选项。为此目的可以使用 GNU getopt_long,或者您可以编写自己的argv解析器(这很容易)。

编辑:其实我想我误读了你想要的。如果您希望-后跟任何数字被解释为具有该数值的选项,我认为没有任何版本getopt可以工作。您无法将每个数字都作为选项进行特殊处理,如果您只是告诉getopt所有数字都是带参数的选项字符,-123则将被解释为-1带有参数的选项23(这很好,您可以解释它从那里),但是一个单独的元素-1会导致下一个argv元素eaten作为 的参数-1,这很难或不可能从中恢复。

于 2010-08-16T03:43:24.963 回答
3

这里发生的是 c 语言完全没有关于处理命令行选项的正确方法的标准。

此外,unix 世界很长一段时间都没有这样的标准(相信在Unix Haters 手册(PDF 链接)中有一个完整的部分)。

因此,人们编写了临时处理机制。这些最终演变为一个共同的(ish)标准并getopt诞生(在贝尔实验室)。后来我们得到了 GNUgetoptgetopt_long. 但是,这些不是必需的,并且某些程序仍然以自己的方式管理事物。

但是在事情稳定下来之前(偶尔也会之后),只要他们认为是个好主意,人们就会在“通常”的处理选项的方式中添加新功能。tail现在,与其他任何功能相比,希望更频繁地调整行是一个不错的选择,因此在当时,让调整变得容易只需少量击键似乎是个好主意……

于 2010-08-16T03:56:31.440 回答
0

我从来没有那么喜欢 getopt,所以我做了平常的事情并重新发明了轮子。我称我的解决方案为 argopt。您可以在https://github.com/colding/argopt获取源代码和手册页。我认为它比 getopt 更容易使用。

于 2010-08-16T12:08:58.897 回答
0

在可能的情况下,我建议更改命令参数语法以避免数字参数,或者通过将数字作为选项参数(例如-n -5)传递,或者仅在--选项分隔符之后允许它。

对于无法更改参数语法的情况,BSD getopt(3) 手册页的 BUGS 部分记录了执行此操作的方法。我已经调整了他们的解决方案以避免POSIXoptreset指定glibc 不支持的解决方案:

int ch;
long num;
char *numarg;

while ((ch = getopt(argc, argv, "0123456789")) != -1) {
    switch (ch) {
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':
        numarg = argv[optind - 1];
        if (numarg[0] == '-' && numarg[1] == ch && numarg[2] == '\0') {
            num = '0' - ch;
        } else if ((numarg = argv[optind]) != NULL && numarg[1] == ch) {
            char *ep;
            int numoptind = optind;

            num = strtol(numarg, &ep, 10);
            if (*ep != '\0') {
                fprintf(stderr, "illegal number -- %s\n", numarg);
                return EXIT_FAILURE;
            }

            /* Advance getopt internal state to next argument. */
            while (optind == numoptind) {
                ch = getopt(argc, argv, "0123456789");
                assert(ch >= '0' && ch <= '9');
            }
        } else {
            fprintf(stderr, "number after other options -- %s\n", numarg);
            return EXIT_FAILURE;
        }
        break;

    default:
        /* Unrecognized option character.  Error printed by getopt. */
        return EXIT_FAILURE;
    }
}

您可以根据需要替换getoptgetopt_long添加额外的短选项或长选项。

于 2016-07-28T20:50:28.283 回答