两个和/或一个bash-if语句
我有一个特殊的条件要在bash脚本中测试。 我想到了这样的事情:两个和/或一个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
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以来视为字符串,不带引号:视为正则表达式)。非常感谢,就是这样。我在客户端检查中使用&&
而不是|
。我没想到否定或会匹配任何东西。非常感谢,就是这个。我在客户端检查中使用&&
而不是|
。我没想到否定或将匹配任何东西。