问题

我希望使用我的shell脚本调用长而短的命令行选项.

我知道可以使用getopts,但像在Perl中一样,我无法用shell做同样的事情.

关于如何做到这一点的任何想法,以便我可以使用选项,如:

 ./shell.sh --copyfile abc.pl /tmp/
./shell.sh -c abc.pl /tmp/
 

在上面,两个命令对我的shell意味着相同的事情,但使用getopts,我无法实现这些?

  最佳答案

可以考虑三种实现:

  • Bash builtin getopts.这不支持使用double-dash前缀的长选项名称.它只支持单字符选项.

  • BSD UNIX 实现独立的 getopt 命令(这是 MacOS 使用的)。

  • GNU实现独立的getopt. GNU getopt(3) (由命令 getopt(1) 在Linux上使用)支持解析长选项.


其他一些答案显示了使用bash builtin getopts模拟长期选项的解决方案.该解决方案实际上做了一个简短的选项,其字符是“ – ”.所以你得到“ – ”作为标志.然后随后任何东西变成OPTARG,并使用嵌套的case测试OPTARG.

这很聪明,但有警告:

  • getopts无法强制执行选择规范.如果用户提供无效选项,则无法返回错误.您必须在解析 OPTARG 时进行自己的错误检查.
  • optarg 用于长选项名,当您的长选项本身有一个参数时,这会使用率复杂化。

因此,虽然可以编写更多的代码来解决长期选项缺乏支持的问题,但这是更多的工作,并且部分地违背了使用getopt解析器来简化代码的目的。

  相同标签的其他问题

bashcommand-line-argumentsgetoptgetopts