Bash 'の条件演算子と代入

コロンの後に代入演算子を付けて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 

コロンの前に代入演算子のみを使用できるのはなぜですか?

コメント

  • 条件演算子を使用して変数の代入を実行するのは楽しいかもしれませんが、'コードが非常に読みにくくなります。'は
  • @devnullコードの読みやすさは、誰が読むかに最も依存します。それでも、あなたの言うことは本当かもしれませんが、私は'でternary演算子をテストしましたdash, zsh, sh、およびbashであり、POSIXで指定されていないにもかかわらず、すべて同じように動作します。私の知る限り、あなたの例はbashzshでのみ機能します。ただし、これはPOSIX対応です:( : ${a?} ) && b=1 || c=1。また、ternaryや独自の例よりもはるかに読みやすいと思います。
  • 回答

    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

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です