如何从命令行参数 - “ tail -10 ”获取 -10 选项。 getopt函数找到'1'字符。但是如何访问字符串“10”?
如果这可以通过getopt_long来完成,那么一个例子会有所帮助。感谢。
答案 0 :(得分:3)
除非您打算-1
作为0
作为其参数的选项,否则答案是您没有。 getopt
仅用于处理符合标准POSIX实用程序选项语法的选项。可以使用GNU getopt_long
来实现此目的,或者您可以编写自己的argv
解析器(这很容易)。
编辑:其实我觉得我误读了你想要的东西。如果您希望将-
后跟任何数字解释为具有该数值的选项,我认为没有任何版本的getopt
可以使用。作为一个选项,你无法将每个数字作为特殊情况,如果只是告诉getopt
所有数字都是带参数的选项字符,-123
将被解释为{{1}参数为-1
的选项(很好,您可以从那里解释),但是单独的23
会导致下一个-1
元素获得argv
作为eaten
的论据,这很难或无法从中恢复。
答案 1 :(得分:3)
这里发生的是c语言附带绝对没有关于处理命令行选项的正确方法的标准。
此外,unix世界在相当一段时间内没有这样的标准(相信在Unix Haters Handbook (PDF link)中有关于它的整个部分。)
因此,人们编写了 ad hoc 处理机制。这些最终演变为一个共同的(ish)标准,并且getopt
诞生了(在贝尔实验室)。后来我们得到了GNU getopt
和getopt_long
。但是,这些并不是必需的,有些程序仍以自己的方式管理事物。
但是在事情稳定下来之前(偶尔会有事情发生),人们在处理选项的“通常”方式中添加了新功能,只要它们看起来是个好主意。现在,tail
希望比其他任何功能都更频繁地调整数字行,这是一个不错的选择,因此使其 easy 和几次击键进行调整当时似乎是一个好主意......
答案 2 :(得分:0)
我从来没有像那样喜欢getopt,所以我做了平常的事情并重新发明了轮子。我称之为解决方案argopt。您可以在https://github.com/colding/argopt获取源和手册页。我认为,它比getopt更容易使用。
答案 3 :(得分:0)
在可能的情况下,我建议更改命令参数语法以避免数字参数,方法是将数字作为选项参数传递(例如-n -5
)或仅在--
选项分隔符后允许它。
对于无法更改参数语法的情况,BUGS section of the BSD getopt(3) man page会记录一种方法。我已调整其解决方案以避免optreset
,即not specified by POSIX和not supported by 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
,并根据需要添加其他短期或长期选项。