如何用多个 or 语句简化条件?

如何用多个 or 语句简化条件?

我正在编写一个 shell 脚本来检查参数是否与字符串匹配。其中大约有 20 个,将来可能需要添加更多。

目前我写的方式很难阅读并且更新起来也很麻烦。我对 shell 脚本编写不太熟悉,所以我不确定简化此操作并使其更易于管理的最佳方法。

if [ $4 =="CRITICAL" ] && [[ $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || $2 == "foo" || $2 == "bar" || ]]
  VARIABLE=1
fi

在上面的脚本中,Foo 和 bar 都是不同的字符串。

答案1

在标准 shell 中,您可以使用case,它支持交替:

#!/bin/sh
if [ "$4" = CRITICAL ]; then
        case $2 in
        foo|bar|doo|quux)
                VARIABLE=1
                ;;
        esac
fi

如果在上面写五行case太冗长,就写在一行上:

 case $2 in foo|bar|doo|quux) VARIABLE=1;; esac

请注意,这==不是 中的标准[ .. ],但 Bash 和 ksh 中支持它。

答案2

if [[ $4 == CRITICAL && $2 =~ ^(a|b|c|d|e|f|g)$ ]]; then
  VARIABLE=1
fi

顺便说一句,不带引号的变量和位置参数在 内部使用是安全的[[ ... ]],但在[ ... ].换句话说,你[ $4 == "CRITICAL" ]应该是[ "$4" == "CRITICAL" ]

另外,CRITICAL上面根本不需要引用。它是一个固定字符串,没有空格或 shell 元字符。如果它是一个固定字符串,由于任何原因确实需要引号,那么最好使用单引号。

单引号用于固定字符串,双引号用于当您想要将变量、命令替换等插入字符串时。

答案3

也许使用case与函数结合的语句?

function a_func){ ... }
function b_func(){ ... }

case "${1}" in
  "${4}" == "CRITICAL" && $(echo "${2}" | egrep -n 'a|b|c|d|e|f|g') -gt 0))
    a_func ;;
  *)
    b_func ;;
esac

虽然是伪代码,但它应该引导方向

相关内容