两个AND / OR在一个bash if语句中

时间:2017-03-29 13:55:17

标签: bash if-statement

我有一个特殊的条件要在bash脚本中测试。 我想到了类似的东西:

if [[ $categorie = "DG" || $categorie = "DI" ]] && [[ $client != "host1" || $client != "host2" ]]; then
    echo "requirements are met"
else
    echo "requirements not met"
fi

单词:如果categorieDGDI而且client不是host1host2则执行操作。

这是对的吗? 对我来说,看起来它只关心categorie,如果满足categorie条件就可以了,打印出“满足要求”并且根本不关心客户端的条件。 / p>

3 个答案:

答案 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