我的 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