我想知道为什么
i=10
if [ $i -lt 5 ]; then
echo "$i < 5"
elif [ $i -gt 5 ]; then
echo "$i > 5"
elif [ $i -eq 5 ]; then
echo "$i = 5"
fi
输出正确的结果:
10 > 5
尽管
i=10
[ $i -lt 5 ] && {
echo "$i < 5"
} || [ $i -gt 5 ] && {
echo "$i > 5"
} || [ $i -eq 5 ] && {
echo "$i = 5"
}
表现得很不寻常:
10 > 5
10 = 5
在我看来,当翻译寻求1
时,它应该是这样的:
0&amp;&amp; {} || 1&amp;&amp; {} || 0&amp;&amp; {}
0所以0&amp;&amp; {}肯定是0;跳过
{}
1表示必须检查{}以定义整个
的值1 && {}
因此结果为1,但执行的唯一{}
仍在1
之后。
但是,当我放置! {
而不是{
时,这一切都可行。
i=10
[ $i -lt 5 ] && ! {
echo "$i < 5"
} || [ $i -gt 5 ] && ! {
echo "$i > 5"
} || [ $i -eq 5 ] && ! {
echo "$i = 5"
}
WHY?我认为它会寻找1
,因为它在0
中找到了&&
,它不会查看链中的其他表达式!
答案 0 :(得分:5)
{...}没有区别,所以你拥有的就是这个:
i=10
[ $i -lt 5 ] &&
echo "$i < 5" ||
[ $i -gt 5 ] &&
echo "$i > 5" ||
[ $i -eq 5 ] &&
echo "$i = 5"
它的工作方式是:
[ $i -lt 5 ]
:这是假的(返回失败),因此它跳转到下一个||
,后面跟着[ $i -gt 5 ]
。
[ $i -gt 5 ]
:这是真的(返回成功),因此它跳转到下一个&&
,后面跟着echo "$i > 5"
。
echo "$i > 5"
:这会返回成功,因此会跳转到下一个&&
,后面跟echo "$i = 5"
。
echo "$i = 5"
:这会返回成功,因此会跳转到...等等,有新行。我们已经完成了。
&&
和||
被称为短路运营商。
编辑:进一步强调这一点,
A && B || C
不与
相同if A; then
B
else
C
fi
它相当于
if A; then
if ! B; then
C
fi
else
C
fi
答案 1 :(得分:4)
&&
和||
从左到右进行评估。您的命令或多或少与此相同:
(((( false && { echo 1; true; } ) || true ) && { echo 2; true; } ) || false ) && { echo 3; true; }
false && { echo 1; true; }
不打印任何内容,并评估为false
false || true
评估为true
true && { echo 2; true; }
打印2
并评估为true
true || false
评估为true
true && { echo 3; true; }
打印3
并评估为true
。神秘解决了。