OR 和 AND 运算符如何协同工作以将布尔值设置为变量

OR 和 AND 运算符如何协同工作以将布尔值设置为变量

我试图了解这行代码是如何工作的。例如,我们有三个变量Value_1Value_2Value_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_1Value_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。

相关内容