两个和/或一个bash-if语句

两个和/或一个bash-if语句,bash,if-statement,Bash,If Statement,我有一个特殊的条件要在bash脚本中测试。 我想到了这样的事情: if [[ $categorie = "DG" || $categorie = "DI" ]] && [[ $client != "host1" || $client != "host2" ]]; then echo "requirements are met" else echo "requirements not met" fi 换句话说:如果category是DG或DI并且client不是h

我有一个特殊的条件要在bash脚本中测试。 我想到了这样的事情:

if [[ $categorie = "DG" || $categorie = "DI" ]] && [[ $client != "host1" || $client != "host2" ]]; then
    echo "requirements are met"
else
    echo "requirements not met"
fi
换句话说:如果
category
DG
DI
并且
client
不是
host1
host2
,那么就做一些事情

这是正确的吗?
对我来说,它似乎只关心
categorie
,如果
categorie
条件得到满足,它就可以打印“满足要求”,而根本不关心客户的条件。

你是对的。由于任何字符串始终不等于两个不同字符串中的至少一个,因此
&&
后面的部分始终为真。

您是正确的。因为任何字符串总是不等于两个不同字符串中的至少一个,所以
&
后面的部分总是正确的。

英语和逻辑学赋予否定或不同的含义-很容易混淆

考虑
$client
的可能值;它们是“host1”、“host2”和“other”。如果值为“host1”,则
|
中的第二项为真;如果是“host2”,则
|
中的第一项为true;如果为“其他”,则
|
中的两个术语均为真;这意味着条件总是正确的

如果客户端不等于主机1,也不等于主机2,则将该
|
替换为
&&

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

线对总是相同的——表达式是等价的。我相信,结果就是你想要的。

英语和逻辑学赋予否定或不同的含义——很容易混淆

考虑
$client
的可能值;它们是“host1”、“host2”和“other”。如果值为“host1”,则
|
中的第二项为真;如果是“host2”,则
|
中的第一项为true;如果为“其他”,则
|
中的两个术语均为真;这意味着条件总是正确的

如果客户端不等于主机1,也不等于主机2,则将该
|
替换为
&&

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

线对总是相同的——表达式是等价的。我相信,结果就是你想要的。

你可以绕过否定或通过与模式进行比较,而不是进行多重比较,这将简化测试

if [[ $categorie == D[GI] ]] && [[ $client != host[12] ]]; then
    echo "requirements are met"
else
    echo "requirements not met"
fi

您可以通过对模式进行否定或比较,而不是进行多次比较,从而简化测试

if [[ $categorie == D[GI] ]] && [[ $client != host[12] ]]; then
    echo "requirements are met"
else
    echo "requirements not met"
fi

你引用了错误的东西。所有变量都应该被引用,以避免在分词和全局扩展时出现意外,对于所有文本来说,它都是多余的。@Jens我认为双括号可以防止这种情况发生?也许,它们是非标准的(在bash中,它们是对的)。(POSIX标准)单括号不会阻止这一点。在
[[]]
中,引号仅在
=
/
=
的右侧起作用=(带引号:视为字符串,不带引号:视为全局模式)和位于
=~
右侧(带引号:自Bash 3.2以来视为字符串,不带引号:视为正则表达式)。您引用了错误的内容。所有变量都应该被引用,以避免在分词和全局扩展时出现意外,对于所有文本来说,它都是多余的。@Jens我认为双括号可以防止这种情况发生?也许,它们是非标准的(在bash中,它们是对的)。(POSIX标准)单括号不会阻止这一点。在
[[]]
中,引号仅在
=
/
=
的右侧起作用=(带引号:视为字符串,不带引号:视为全局模式)和右侧的
=~
(带引号:自Bash 3.2以来视为字符串,不带引号:视为正则表达式)。非常感谢,就是这样。我在客户端检查中使用
&&
而不是
|
。我没想到否定或会匹配任何东西。非常感谢,就是这个。我在客户端检查中使用
&&
而不是
|
。我没想到否定或将匹配任何东西。