我对getopts构造有点问题。 我通过getopts定义了多个变量,并且在进一步编写脚本之前我必须检查一些条件。
用户不应该同时定义两个特殊选项(-t
为$target
而-tg
为$targetgroup
)。所以我正在寻找的是一个检查的结构:
$target
,则$targetgroup
必须为空,$targetgroup
$target
必须为空。我已经使用[[ -z $target ]]
,[[ -n $targetgroup ]]
和检查退出代码完成了一种解决方法,但我认为这种做法完全是错误的。
有没有简单的方法来实现这个目标?
答案 0 :(得分:2)
为了测试这样的1-of-n条件,我们可以使用:+
修饰符进行参数扩展。仅当${target:+1}
非空时,1
才会展开为$target
。因此,您可以测试"${target:+1}${targetgroup:+1}"
不包含多个1
:
if [[ ${target:+1}${targetgroup:+1} == 11* ]]
then
echo 'Error: it is invalid to specify both -t and -tg' >&2
exit 1
fi
对于这种特殊情况(只有两个相互排斥的变量),我们不需要模式中的*
。它就在那里,您可以轻松添加更多不必与这两者中的任何一个一起使用的选项,而无需更改任何其他选项。
您也可以在允许使用一组参数的任何 n 的地方使用它;为此,您需要在匹配字符串中写入 n +1 1
。
如果您希望完全提供两个选项之一,请将测试更改为!= 1
。
答案 1 :(得分:0)
我会考虑将两个(或多个)互斥标志合并到一个带参数的选项中。也就是说,不是-t
和-tg
是单独的参数,而是定义-x <arg>
,其中<arg>
可以是t
或tg
。
while getopts "x:" opt; do
case $opt in
x) case $OPTARG of
t) ... ;;
tg) ... ;;
*) echo "Invalid argument for -x: $OPTARG" ;;
sac ;;
...
esac
done