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

Jos*_*osh 4 shell-script

我正在编写一个 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
Run Code Online (Sandbox Code Playgroud)

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

ilk*_*chu 8

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

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

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

 case $2 in foo|bar|doo|quux) VARIABLE=1;; esac
Run Code Online (Sandbox Code Playgroud)

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


cas*_*cas 6

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

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

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

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

  • 首先,如果 $4 为空,则语法错误。未加引号,如果 $4 为空,则为 `[ == "CRITICAL" ]`。引用,它是 `[ "" == "CRITICAL" ]`。`==` 需要两个操作数。 (2认同)
  • 它可能是这样写的,因为很多人在 shell 脚本中正确引用变量时都很草率。要么是因为他们不知道他们应该这样做,要么是因为他们很懒惰,或者他们只是假设“没有什么可能出错,因为我的代码是完美的,而且我已经考虑了可能发生的所有可能的变化”。当然,这最后一个原因是高度可信的,是最高技能的标志。 (2认同)