如何从命令行参数“ tail -10 ”获取选项-10。getopt 函数找到'1'字符。但是如何访问字符串"10"?
如果这可以通过 getopt_long 完成,那么举个例子会有所帮助。谢谢。
除非您打算-1
将其作为参数的选项,否则0
答案是您不打算。getopt
仅用于处理符合标准 POSIX 实用程序选项语法的选项。为此目的可以使用 GNU getopt_long
,或者您可以编写自己的argv
解析器(这很容易)。
编辑:其实我想我误读了你想要的。如果您希望-
后跟任何数字被解释为具有该数值的选项,我认为没有任何版本getopt
可以工作。您无法将每个数字都作为选项进行特殊处理,如果您只是告诉getopt
所有数字都是带参数的选项字符,-123
则将被解释为-1
带有参数的选项23
(这很好,您可以解释它从那里),但是一个单独的元素-1
会导致下一个argv
元素eaten
作为 的参数-1
,这很难或不可能从中恢复。
这里发生的是 c 语言完全没有关于处理命令行选项的正确方法的标准。
此外,unix 世界很长一段时间都没有这样的标准(相信在Unix Haters 手册(PDF 链接)中有一个完整的部分)。
因此,人们编写了临时处理机制。这些最终演变为一个共同的(ish)标准并getopt
诞生(在贝尔实验室)。后来我们得到了 GNUgetopt
和getopt_long
. 但是,这些不是必需的,并且某些程序仍然以自己的方式管理事物。
但是在事情稳定下来之前(偶尔也会之后),只要他们认为是个好主意,人们就会在“通常”的处理选项的方式中添加新功能。tail
现在,与其他任何功能相比,希望更频繁地调整行数是一个不错的选择,因此在当时,让调整变得容易且只需少量击键似乎是个好主意……
我从来没有那么喜欢 getopt,所以我做了平常的事情并重新发明了轮子。我称我的解决方案为 argopt。您可以在https://github.com/colding/argopt获取源代码和手册页。我认为它比 getopt 更容易使用。
在可能的情况下,我建议更改命令参数语法以避免数字参数,或者通过将数字作为选项参数(例如-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;
}
}
您可以根据需要替换getopt
并getopt_long
添加额外的短选项或长选项。