![Bash OR 연산자는 여러 변수를 평가하지 않습니다.](https://linux55.com/image/99146/Bash%20OR%20%EC%97%B0%EC%82%B0%EC%9E%90%EB%8A%94%20%EC%97%AC%EB%9F%AC%20%EB%B3%80%EC%88%98%EB%A5%BC%20%ED%8F%89%EA%B0%80%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
내 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