我想用标准shell编写一个工具。现在我有三种选择来处理用户的输入:shell输入参数的最佳实践?
$ and loop
getopt
getopts
所以大一的问题是,考虑到便携性,其中一个是我最好的做法呢?
P.S.我的工具有输入象下面这样:
mytool.sh [-fl] [-c|--conf file]
因此,提供了三个参数:
-f
-l
-c | --conf
我想用标准shell编写一个工具。现在我有三种选择来处理用户的输入:shell输入参数的最佳实践?
$ and loop
getopt
getopts
所以大一的问题是,考虑到便携性,其中一个是我最好的做法呢?
P.S.我的工具有输入象下面这样:
mytool.sh [-fl] [-c|--conf file]
因此,提供了三个参数:
-f
-l
-c | --conf
getopts
不能做你想做的,因为它不支持“长选项”像--conf
。
getopt
是可变的;有些实现支持长选项,有些则不支持。 (有些系统没有任何实现)。所以我猜测,因为你不需要Bash特定的解决方案,所以你也不想使用getopt
。
这样留给你自己写循环。 。 。这实际上很丑陋,特别是因为你不想在循环中使用任何Bash特有的功能。
如果您仅使用便携式结构对您很重要,我建议您不要再支持长选项--conf
,因此您可以使用getopts
。 (或者,您可以取消对合并选项符号-fl
的支持,因此编写自定义循环会更容易,但这比使用getopts
更有用。)
我相信传统的'getopts'(内建)与选项合并非常好,所以支持'-fl'应该不成问题。你说得对,他不得不放弃'--conf'。 –
@AaronDavies:它似乎在Bash中工作(虽然它似乎没有记录,但我不确定它如何记住它在合并选项中的位置),但是POSIX没有指定它,所以我不会说'不要期望它可以在任意外壳中工作。 – ruakh
@AaronDavies:实际上,更正:看起来像POSIX *确实*说明,它说'getopts'应支持实用语法指南3-10(含)“,其中指南5是”Options without option-当分组在一个“ - ”分隔符后面时应该接受参数。“我会编辑我的答案。谢谢! – ruakh
getopt
,这里一般意义的可执行程序发现为/usr/bin/getopt
(与在各种shell中找到的相同名称的内建函数相对)可能是您对shell不可知的长选项支持的最佳选择。内置的传统getopts
根本无法处理长期选项,并且已经实现它们的外壳已经以相互不兼容的方式完成。
您可以通过在"[email protected]"
自己循环,但使用标准工具的过程中实现完全自定义的选项处理逻辑,通常是一个更好的主意。
我认为你的第一段使用'getopt'来表示'getopts',反之亦然。 (虽然即使在修正之后,我也不认为它是完全正确的。) – ruakh
嗯。也许你是对的。我还在线查找'/ usr/bin/getopts'文件。不知道它有多普遍。 (我个人不是很熟悉先进的打印选项解析 - 我做了所有我最近的shell脚本在ksh93的,其具有优异的,但完全特质,长选项在它的版本内置的支持。)在任何情况下,答案编辑以反映您的评论。 –
在我上面的评论中,“打印”当然是“便携式”的错字。 –
您需要支持哪些平台? Linux和OS X都有bash作为标准;如果你需要Windows用户使用Cygwin,他们也会有bash。我认为其他平台通常不值得支持。 –
仅适用于Linux,但应确保它是标准shell而不是特定于bash。我已更新问题以显示更多详细信息。 – harryz
所以实际上bash标签与这个问题无关。我已经删除它。 –