我正在使用getopt来解析选项。我解析的选项之一(-a
)具有强制性参数。
我的getopt调用看起来像这样:
while((c = getopt(argc, argv, "a:b")) != -1) {
switch(c) {
case 'a':
foo = atoi(optarg);
break;
...
}
}
这是我的问题:
假设某人运行./my-command -a100b
。我想让我的程序告诉我们,有一个-a
选项,参数为100 ,有一个-b
选项。但是,getopt将其解析为带有参数-a
的{{1}}选项。
如何告诉getopt尚未解析100b
?我想告诉getopt从字符-a100b
开始解析,以便它识别出有一个b
选项。
答案 0 :(得分:2)
假设某人运行
./my-command -a100b
。我想让我的程序告诉 有一个-a
选项,参数为100 ,有一个-b
选项。 但是,getopt将其解析为带有参数-a
的{{1}}选项。
是的,确实如此。这就是100b
解析的选项语言的工作方式。
如何告诉getopt尚未解析
getopt()
?我想要 告诉getopt从字符-a100b
开始解析,以便它识别 有一个b
选项。
不能。 POSIX标准-b
或我所知的任何扩展版本(例如GNU的扩展版本)均不支持这种功能。特别是,POSIX specficiation for getopt
部分说来
getopt()
函数是一个命令行解析器,应遵循 XBD Utility中的实用程序语法准则3、4、5、6、7、9和10 语法准则。
Those guidelines关于命令行选项以及它们的格式。与您的问题最相关的是:
准则3: 每个选项名称应为可移植字符集中的单个字母数字字符(字母数字分类)。 [...]
准则4: 所有选项均应以'-'分隔符开头。
准则5: 在以下情况下,应接受一个或多个没有选项参数的选项,然后是最多一个带有选项参数的选项 分组在一个'-'分隔符后面。
准则6: 每个选项和选项参数都应该是一个单独的参数,除非实用程序参数语法的项目(2)中有说明。
请特别注意准则5:将选项组合在一起时,只有最后一个可能带有参数。这样一来,该组的尾部或下一个完整参数就可以解释为参数,这就是您看到的getopt()
的作用。
当然,如果您希望程序接受不符合POSIX准则的选项,则可以随意这样做,但是您可能需要执行自己的选项解析。也许您可以获得getopt
的帮助,但是您需要在顶部添加一个平凡的自定义解析层。从头开始自己滚动可能会更容易。