2014-01-11 45 views
2

我想用标准shell编写一个工具。现在我有三种选择来处理用户的输入:shell输入参数的最佳实践?

$ and loop 
getopt 
getopts 

所以大一的问题是,考虑到便携性,其中一个是我最好的做法呢?

P.S.我的工具有输入象下面这样:

mytool.sh [-fl] [-c|--conf file] 

因此,提供了三个参数:

  • -f
  • -l
  • -c | --conf
+0

您需要支持哪些平台? Linux和OS X都有bash作为标准;如果你需要Windows用户使用Cygwin,他们也会有bash。我认为其他平台通常不值得支持。 –

+0

仅适用于Linux,但应确保它是标准shell而不是特定于bash。我已更新问题以显示更多详细信息。 – harryz

+0

所以实际上bash标签与这个问题无关。我已经删除它。 –

回答

1

getopts不能做你想做的,因为它不支持“长选项”像--conf

getopt是可变的;有些实现支持长选项,有些则不支持。 (有些系统没有任何实现)。所以我猜测,因为你不需要Bash特定的解决方案,所以你也不想使用getopt

这样留给你自己写循环。 。 。这实际上很丑陋,特别是因为你不想在循环中使用任何Bash特有的功能。

如果您仅使用便携式结构对您很重要,我建议您不要再支持长选项--conf,因此您可以使用getopts。 (或者,您可以取消对合并选项符号-fl的支持,因此编写自定义循环会更容易,但这比使用getopts更有用。)

+0

我相信传统的'getopts'(内建)与选项合并非常好,所以支持'-fl'应该不成问题。你说得对,他不得不放弃'--conf'。 –

+0

@AaronDavies:它似乎在Bash中工作(虽然它似乎没有记录,但我不确定它如何记住它在合并选项中的位置),但是POSIX没有指定它,所以我不会说'不要期望它可以在任意外壳中工作。 – ruakh

+0

@AaronDavies:实际上,更正:看起来像POSIX *确实*说明,它说'getopts'应支持实用语法指南3-10(含)“,其中指南5是”Options without option-当分组在一个“ - ”分隔符后面时应该接受参数。“我会编辑我的答案。谢谢! – ruakh

0

getopt,这里一般意义的可执行程序发现为/usr/bin/getopt(与在各种shell中找到的相同名称的内建函数相对)可能是您对shell不可知的长选项支持的最佳选择。内置的传统getopts根本无法处理长期选项,并且已经实现它们的外壳已经以相互不兼容的方式完成。

您可以通过在"[email protected]"自己循环,但使用标准工具的过程中实现完全自定义的选项处理逻辑,通常是一个更好的主意。

+0

我认为你的第一段使用'getopt'来表示'getopts',反之亦然。 (虽然即使在修正之后,我也不认为它是完全正确的。) – ruakh

+0

嗯。也许你是对的。我还在线查找'/ usr/bin/getopts'文件。不知道它有多普遍。 (我个人不是很熟悉先进的打印选项解析 - 我做了所有我最近的shell脚本在ksh93的,其具有优异的,但完全特质,长选项在它的版本内置的支持。)在任何情况下,答案编辑以反映您的评论。 –

+0

在我上面的评论中,“打印”当然是“便携式”的错字。 –