假设我有一个带有标志和参数的命令,如下所示:
mycommand --foo bar arg1 arg2
(该foo
标志的值为"bar"
。)
但是,如果foo
可以选择不带参数提供该标志怎么办?
mycommand --foo arg1 arg2
如何防止arg1
被视为标志的值foo
?
答案1
Unix 中最常用的将命令行标志与其余参数分开的习惯用法是使用双破折号 ( --
)。
如果实用程序使用 C 库函数getopt()
(直接或间接),则双破折号将表示命令行选项的结束,并将getopt()
结束其对命令行的解析。
这是来自getopt(3)
手动的在 OpenBSD 上:
参数列表中选项的解释可以通过选项“--”(双破折号)取消,这会导致 getopt() 发出参数处理结束的信号并返回 -1。
这就是为什么删除名为的文件的正确方法-f
是
$ rm -- -f
例如。
getopts
您的 shell 很可能通过调用此库函数来实现内置命令。
恕我直言,很高兴知道如何getopts
在 shell 脚本和getopt()
C 程序中使用。这并不是很困难,而且当您编写项目的命令行解析代码时,它会让生活变得更加轻松。
getopt_long()
某些 C 库中还提供了用于解析“长选项”( --option=value
) 的功能。然而,这是一个扩展(没有双关语的意思)。
答案2
考虑这样的事情:
mycommand --foo=bar arg1 arg2
=<someval>
在为标志分配值时进行要求将消除歧义。
很明显,这是未指定值的不同情况:
mycommand --foo arg1 arg2
答案3
对此没有一般性的答案。这完全取决于如何mycommand
解释其论点。例如,如果只接受永远不会作为参数值出现的mycommand
有限数量的值,则可以消除歧义,因此可以通过检查下一个命令行参数是否是可接受的值来轻松检测到省略的值。foo
foo
foo