コロンの後の代入演算子で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) ))
これは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
によるエラー。
いずれにせよ、これはあなたが思っていることを実行するとは思わないので、あまり問題ではありません。
三項演算子は、テストに基づいて値を返します。分岐には使用されません。
以下は、bashの疑似3項演算子を取得する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</ code>