我有一个特殊的条件要在bash脚本中测试。 我想到了类似的东西:
if [[ $categorie = "DG" || $categorie = "DI" ]] && [[ $client != "host1" || $client != "host2" ]]; then
echo "requirements are met"
else
echo "requirements not met"
fi
单词:如果categorie
为DG
或DI
而且client
不是host1
或host2
则执行操作。
这是对的吗?
对我来说,看起来它只关心categorie
,如果满足categorie
条件就可以了,打印出“满足要求”并且根本不关心客户端的条件。 / p>
答案 0 :(得分:1)
英语和逻辑将不同的含义归结为否定的OR - 很容易混淆。
考虑$client
的可能值;他们是“主人1”,“主人2”和“其他人”。如果值为' host1' ||
中的第二个词是真的;如果它是' host2',||
中的第一个词是真的;如果是其他' ||
中的两个词都是真的;这意味着条件总是正确的。
将||
替换为&&
- 如果客户端不等于host1且不等于host2。
if [[ "$categorie" = "DG" || "$categorie" = "DI" ]] &&
[[ "$client" != "host1" && "$client" != "host2" ]]; then
echo "requirements are met"
else
echo "requirements not met"
fi
或使用!(client == host1 || client == host2)
可以翻译为:
if [[ "$categorie" = "DG" || "$categorie" = "DI" ]] &&
[[ ! ( "$client" = "host1" || "$client" = "host2" ) ]]; then
echo "requirements are met"
else
echo "requirements not met"
fi
将其放入测试脚本中:
for categorie in DG DI XX
do
for client in host1 host2 other
do
if [[ "$categorie" = "DG" || "$categorie" = "DI" ]] &&
[[ "$client" != "host1" && "$client" != "host2" ]]; then
echo "(categorie $categorie; client $client): requirements are met"
else
echo "(categorie $categorie; client $client): requirements not met"
fi
if [[ "$categorie" = "DG" || "$categorie" = "DI" ]] &&
[[ ! ( "$client" = "host1" || "$client" = "host2" ) ]]; then
echo "(categorie $categorie; client $client): requirements are met"
else
echo "(categorie $categorie; client $client): requirements not met"
fi
done
done
输出:
(categorie DG; client host1): requirements not met
(categorie DG; client host1): requirements not met
(categorie DG; client host2): requirements not met
(categorie DG; client host2): requirements not met
(categorie DG; client other): requirements are met
(categorie DG; client other): requirements are met
(categorie DI; client host1): requirements not met
(categorie DI; client host1): requirements not met
(categorie DI; client host2): requirements not met
(categorie DI; client host2): requirements not met
(categorie DI; client other): requirements are met
(categorie DI; client other): requirements are met
(categorie XX; client host1): requirements not met
(categorie XX; client host1): requirements not met
(categorie XX; client host2): requirements not met
(categorie XX; client host2): requirements not met
(categorie XX; client other): requirements not met
(categorie XX; client other): requirements not met
线对总是相同的 - 表达式是等价的。我相信结果是你想要的。
答案 1 :(得分:0)
你是对的。由于任何字符串始终不等于两个不同字符串中的至少一个,因此&&
之后的部分始终为真。
答案 2 :(得分:0)
通过比较模式而不是进行多重比较,你可以绕过否定OR,这简化了测试
if [[ $categorie == D[GI] ]] && [[ $client != host[12] ]]; then
echo "requirements are met"
else
echo "requirements not met"
fi