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

이것은 예상됩니다. 연산자의 한 항이 ||로 평가 되면 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

관련 정보