【发布时间】:2016-04-04 19:36:39
【问题描述】:
我有以下简单的代码:
#!/usr/bin/env bash
while getopts :f arg; do
case $arg in
f) echo Option $arg specified. ;;
*) echo Unknown option: $OPTARG. ;;
esac
done
它适用于简单的场景,例如:
$ ./test.sh -f
Option f specified.
$ ./test.sh -a -f
Unknown option: a.
Option f specified.
但它不适用于以下情况:
$ ./test.sh foo -f
$ ./test.sh -a abc -f
Unknown option: a.
如何修复上述代码示例以支持无效参数?
【问题讨论】:
-
“支持无效参数”是什么意思?
getopts在第一个非选项处停止解析(例如foo或abc)。你想让它做什么?不这样做并解析所有内容? -
支持无效参数,以识别
-f尽管指定了未知参数,所以-a abc -f仍会识别-f,但似乎getopts一旦无效就停止处理找到参数。 -
它在第一个非选项参数处停止(即
abc)。例如,-a -a -a -a -f将打印四次 unknown。 -
@EtanReisner 在我看来,它停止很奇怪。实际上,对于涉及多次调用
getopts的更扩展的脚本,我确实需要它(但我不想让它变得复杂)。因此,第一次调用处理所有已知选项,进一步调用仅检查特定参数,但它们失败了,因为它们无法识别先前的参数(我不在乎进一步调用)。 -
同样,未知选项不是问题。非选项参数(不以
-开头的参数)是“问题”。在第一个非选项参数上停止是 POSIX 指定的行为。这对您来说只是一个问题,因为您正在解析相同的参数以寻找不同的有效选项。如果你只是告诉每个 getopts 调用关于每个参数(但实际上只对你关心的参数做任何事情)你不应该有问题。
标签: bash shell syntax arguments getopts