OR演算子とAND演算子が連携してブール値を変数に設定する方法

OR演算子とAND演算子が連携してブール値を変数に設定する方法

このコード行がどのように機能するかを理解しようとしています。たとえば、最初に設定された3つの変数Value_1があります。上記の3つの変数がすべてfalseに設定されている場合(または3つの変数のいずれかがfalseに設定されている場合)、falseに設定される4番目の変数があります。これは有効なbashロジックですが、まだ問題があります。実際にどのように機能するのか理解しています。Value_2Value_3falsemain_valuemain_valuetruetrue

[ ${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

デフォルトでは、またはがtrueの場合はValue_1trueValue_2Value_3設定されmain_valueます。どちらも true と等しくない場合は false に設定されます。このような条件が互いに絡み合っていると、状況が混乱する可能性があります。


どのように機能するかを確認できますset -x

最初のものが正しいので、次にすぐに移動します&&

$ [[ foo == foo ]] || [[ bar == foo ]] || [[ baz == bar ]] && echo yes || echo no
+ [[ foo == foo ]]
+ echo yes
yes

1つ目はfalseなので、2つ目は評価され、2つ目はtrueなので、次に進みます&&

$ [[ foo == bar ]] || [[ bar == bar ]] || [[ baz == bar ]] && echo yes || echo no
+ [[ foo == bar ]]
+ [[ bar == bar ]]
+ echo yes
yes

最初と2番目は偽であるため、3番目を評価して真であるため、次に進みます&&

$ [[ foo == bar ]] || [[ bar == baz ]] || [[ baz == baz ]] && echo yes || echo no
+ [[ foo == bar ]]
+ [[ bar == baz ]]
+ [[ baz == baz ]]
+ echo yes
yes

3つとも偽物なので決勝に進出してください||

$ [[ 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を評価します。

関連情報