小编典典

使用 getopts 处理长短命令行选项

all

我希望使用我的 shell 脚本调用长短形式的命令行选项。

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

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

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

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


阅读 118

收藏
2022-03-15

共1个答案

小编典典

可以考虑三种实现方式:

  • bash 内置getopts。这不支持带有双破折号前缀的长选项名称。它仅支持单字符选项。

  • 独立命令的 BSD UNIX 实现getopt(这是 MacOS 使用的)。这也不支持长选项。

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


其他一些答案显示了使用 bash
内置getopts模拟长选项的解决方案。该解决方案实际上是一个简短的选项,其字符为“-”。所以你得到“–”作为标志。然后后面的任何内容都变为
OPTARG,然后您使用嵌套的case.

这很聪明,但有一些警告:

  • getopts无法强制执行 opt 规范。如果用户提供了一个无效的选项,它就不能返回错误。在解析 OPTARG 时,您必须自己进行错误检查。
  • OPTARG 用于长选项名称,当您的长选项本身有参数时,这会使使用变得复杂。您最终不得不自己编写代码作为附加案例。

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

2022-03-15