web-dev-qa-db-ja.com

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

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

6
MS.Kim

Bashは最後のコマンドを次のように解析します

a=1; (( (a? b=1 : c)=1 ))

これが機能しない理由を明らかにする必要があります。代わりに、使用する必要があります

a=1; (( a? b=1 : (c=1) ))
4
celtschk

これはternary assignment式と呼ばれます。これは私の別の答えからのビットです:

% 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 ))

これを正しく使用しているとは思わない。

wikipedia から:

?:は次のように使用されます:

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式のリンクを読むと、評価が短絡されているため、false側の割り当てがわかります1 = trueによるエラー。

いずれにせよ、これはあなたが思っていることを実行するとは思わないので、あまり問題ではありません。

2
mikeserv

三項演算子は、テストに基づいて値を返します。分岐には使用されません。

以下は、bashの疑似3項演算子を取得する1つの方法です(バックティックに注意)。

$result=`[ < condition > ] && echo "true-result" || echo "false-result" `

$ a=$ c=`[ $a ] && echo 1 || echo 0`$ echo $c0$ a=5$ c=`[ $a ] && echo 1 || echo 0`$ echo $c 1</ code>

1
bearvarine