我希望使用我的 shell 脚本调用长短形式的命令行选项。
我知道getopts可以使用,但就像在 Perl 中一样,我无法使用 shell 做同样的事情。
getopts
关于如何做到这一点的任何想法,以便我可以使用以下选项:
./shell.sh --copyfile abc.pl /tmp/ ./shell.sh -c abc.pl /tmp/
在上面,这两个命令对我的 shell 意味着同样的事情,但是使用getopts,我无法实现这些?
可以考虑三种实现方式:
bash 内置getopts。这不支持带有双破折号前缀的长选项名称。它仅支持单字符选项。
独立命令的 BSD UNIX 实现getopt(这是 MacOS 使用的)。这也不支持长选项。
getopt
独立的 GNU 实现getopt。GNU getopt(3)(由 Linux 上的命令行getopt(1)使用)支持解析长选项。
getopt(3)
getopt(1)
其他一些答案显示了使用 bash 内置getopts模拟长选项的解决方案。该解决方案实际上是一个简短的选项,其字符为“-”。所以你得到“–”作为标志。然后后面的任何内容都变为 OPTARG,然后您使用嵌套的case.
case
这很聪明,但有一些警告:
因此,虽然可以编写更多代码来解决对长选项缺乏支持的问题,但这需要做更多的工作,并且部分违背了使用 getopt 解析器来简化代码的目的。