如果定义了变量1,则变量2必须为空,反之亦然

时间:2016-11-04 08:23:21

标签: linux bash shell

我对getopts构造有点问题。 我通过getopts定义了多个变量,并且在进一步编写脚本之前我必须检查一些条件。

用户不应该同时定义两个特殊选项(-t$target-tg$targetgroup)。所以我正在寻找的是一个检查的结构:

  • 如果定义了$target,则$targetgroup必须为空,
  • 如果定义$targetgroup $target必须为空。

我已经使用[[ -z $target ]][[ -n $targetgroup ]]和检查退出代码完成了一种解决方法,但我认为这种做法完全是错误的。

有没有简单的方法来实现这个目标?

2 个答案:

答案 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>可以是ttg

while getopts "x:" opt; do
  case $opt in
    x) case $OPTARG of
         t) ... ;;
         tg) ... ;;
         *) echo "Invalid argument for -x: $OPTARG" ;;
       sac ;;
    ...
  esac
done