コロンの後に代入演算子を付けてbashの条件演算子を使用できますか?
Bashリファレンスマニュアルでは、算術演算子について次のように説明しています。
- 条件演算子
expr ? expr : expr
- 割り当て
= *= /= %= += -= <<= >>= &= ^= |=
まず、このコードはうまく機能しているようです:
a=1; ((a? b=1 : 2 )) #seems to work
しかし、:
の後に代入演算子を使用すると、「非変数への代入を試みました」というエラーが発生しました:
a=1; ((a? b=1 : c=1)) #attempted assignment to non-variable error
コロンの前に代入演算子のみを使用できるのはなぜですか?
コメント
回答
Bashは最後のコマンドを
a=1; (( (a? b=1 : c)=1 ))
として解析します。これにより機能しない理由が明らかになります。代わりに、
a=1; (( a? b=1 : (c=1) ))
回答
これを
式。ここに「私の別の答えからのビット:
% a=abc % b=abcd % t=10 ; f=5 % echo $((r=${#a}>${#b}?t:f)) ; echo $r > 5 > 5 % echo $((r=${#a}<${#b}?t:f)) ; echo $r > 10 > 10
おっしゃるように、これは条件付き代入演算です。条件によって異なります。構文は次のように機能します。
$((var = $condition <compare_operator> $condition \ ?if $true_assign :or $false_assign ))
これを正しく使用しているとは思わない。
From ウィキペディア:
?:
が使用されます次のように:
condition ? value_if_true : value_if_false
条件はブール式としてtrueまたはfalseと評価されます。ブール条件の評価に基づいて、条件がtrueの場合は式全体がvalue_if_trueを返し、それ以外の場合はvalue_if_falseを返します。通常、2つのサブ式value_if_trueとvalue_if_falseは同じタイプである必要があり、これによって式全体のタイプが決まります。この型チェックの重要性は、演算子の最も一般的な使用法、つまり条件付き代入ステートメントにあります。この使用法では、次のように、代入ステートメントの右側に式として表示されます。
variable = condition ? value_if_true : value_if_false
?:
演算子は、Scheme、ML、Haskellなどの関数型プログラミング言語で条件式(if-then-else
構文)が機能する方法に似ています。if-then-elseはこれらの言語のステートメントではなく式。
特定の問題はこれに関連していると思います:
if-else構文と同様に、式「x」と「y」のいずれか1つのみが評価されます。
ternary
式に関する上記のリンクを読んだ場合あなたはその評価を見るでしょうnが短絡しているため、 false 側での割り当ては、1 = true
のためにエラーになります。
いずれの場合も、問題ではありません。
回答
三項演算子は、に基づいて値を返します。テスト。これらは分岐には使用されません。
bashの疑似三項演算子を取得する1つの方法です(バックティックに注意してください):
$result=`[ < condition > ] && echo "true-result" || echo "false-result" `
$ a=
$ c=`[ $a ] && echo 1 || echo 0`
$ echo $c
0
$ a=5
$ c=`[ $a ] && echo 1 || echo 0`
$ echo $c
1
ternary
演算子をテストしましたdash, zsh, sh
、およびbash
であり、POSIXで指定されていないにもかかわらず、すべて同じように動作します。私の知る限り、あなたの例はbash
とzsh
でのみ機能します。ただし、これはPOSIX対応です:( : ${a?} ) && b=1 || c=1
。また、ternary
や独自の例よりもはるかに読みやすいと思います。