Bash OR演算子は複数の変数を評価しません。

Bash OR演算子は複数の変数を評価しません。

私のbashスクリプトの次の行は、複数のOR演算子を評価しません。最初の項目を確認して続行してください。

if [[ "${SERVER_NAME}" != $BITBUCKET || $CONFLUENCE || $CROWD || $JIRA || $JENKINS ]]; then
other code here...
fi

bash -xスクリプトから私はこれを得ました。

+ [[ crowd.server.com != code.server.com ]]

以下は$BITBUCKET変数です。続行する前に、すべての変数を評価するために$SERVER_NAME必要です。crowd.server.com

答え1

これは予想されます。演算子の1項 ||がと評価されると、シーケンスtrue全体の値はになりますtrue

演算子を使用して&&、比較したい文字列に基づいて文字列比較演算子を複数回使用してみてください。

より良い方法は、case次の文を使用することです。

case "${SERVER_NAME}" in
    "$BITBUCKET" | "$CONFLUENCE" | "$CROWD" | "$JIRA" | "$JENKINS") ;; # do nothing for these servers
    *)
    # your original code here...
    ;;
esac

答え2

複数の文字列で文字列を確認したいと思います。これを行う:

if [[ ! "$SERVER_NAME" =~ ^($BITBUCKET|$CONFLUENCE|$CROWD|$JIRA|$JENKINS)$ ]]; then ...

答え3

次または文では何も比較できません。考えてみてください:

#!/bin/bash

if [[ $1 == "foo" || $1 == "bar" ]]; then
    echo "foo or bar"
else
    echo "not foo or bar"
fi

実行後、次のようになります。

./orTest.sh bar
foo or bar
./orTest.sh foo
foo or bar
./orTest.sh foobar
not foo or bar

つまり、@Dmitry Grigoryevは次のように書きました。

比較される文字列と同じ文字列比較演算子を使用します。

これは間違った:

#!/bin/bash

if [[ $1 == "foo" || "bar" ]]; then
    echo "foo or bar"
else
    echo "not foo or bar"
fi

例:

/orTestFail.sh bar
foo or bar
./orTestFail.sh foo
foo or bar
./orTestFail.sh foobar
foo or bar

関連情報