このコード行がどのように機能するかを理解しようとしています。たとえば、最初に設定された3つの変数Value_1
があります。上記の3つの変数がすべてfalseに設定されている場合(または3つの変数のいずれかがfalseに設定されている場合)、falseに設定される4番目の変数があります。これは有効なbashロジックですが、まだ問題があります。実際にどのように機能するのか理解しています。Value_2
Value_3
false
main_value
main_value
true
true
[ ${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_1
trueValue_2
にValue_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を評価します。