我试图了解这行代码是如何工作的。例如,我们有三个变量Value_1
,Value_2
,Value_3
最初设置为false
。还有另一个第四个变量main_value
,如果所有上述三个变量仍然设置为 false,则该变量将main_value
设置为 false(或者true
,如果三个变量中的任何一个设置为 ,则该变量将设置为true
。这是有效的 bash 逻辑,但我仍然很难理解它实际上是如何工作的。
[ ${Value_1} == "true" ] || [ ${Value_2} == "true" ] || [ ${Value_3} == "true" ] && main_value=true || main_value=false
答案1
这可以而且应该这样写:
if [[ $value_1 == true || $value_2 == true || $value_3 == true ]]; then
main_value=true
else
main_value=false
fi
或更多 POSIXly:
if [ "$value_1" = true ] || [ "$value_2" = true ] || [ "$value_3" = true ]; then
main_value=true
else
main_value=false
fi
本质上,如果Value_1
、Value_2
或中的任何一个Value_3
等于 truemain_value
则将被设置为 true。如果它们都不等于 true,则将设置为 false。当把这样的条件串在一起时,事情可能会变得混乱。
你可以看到它是如何工作的set -x
:
第一个是正确的,所以它直接跳到&&
:
$ [[ foo == foo ]] || [[ bar == foo ]] || [[ baz == bar ]] && echo yes || echo no
+ [[ foo == foo ]]
+ echo yes
yes
第一个为 false,因此对第二个进行评估,第二个为 true,因此它跳至&&
:
$ [[ foo == bar ]] || [[ bar == bar ]] || [[ baz == bar ]] && echo yes || echo no
+ [[ foo == bar ]]
+ [[ bar == bar ]]
+ echo yes
yes
第一个和第二个是假的,所以它评估第三个,第三个是真的,所以它移动到&&
:
$ [[ foo == bar ]] || [[ bar == baz ]] || [[ baz == baz ]] && echo yes || echo no
+ [[ foo == bar ]]
+ [[ bar == baz ]]
+ [[ baz == baz ]]
+ echo yes
yes
这三个都是假的,所以进入决赛||
:
$ [[ foo == bar ]] || [[ bar == baz ]] || [[ baz == foo ]] && echo yes || echo no
+ [[ foo == bar ]]
+ [[ bar == baz ]]
+ [[ baz == foo ]]
+ echo no
no
答案2
( OR ||
) 运算符计算左侧 (LHS) 的表达式。如果 LHS 为 TRUE,则结果||
变为 TRUE,并且不评估右侧 (RHS)。如果 LHS 为 FALSE,则计算 RHS,并将其用作 的结果||
。这通常用于“做这个,但如果失败,就做那个”的思维过程。
类似地,&&
操作员仅在其 LHS 为 TRUE(“执行此操作,如果成功则执行此操作”)时才评估其 RHS。