Stéphane Chazelasは2つの例を挙げました。変数の値は、参照または割り当てられたときに算術式として評価されます。
$ a=1+1; echo "$((a * 3)) $(($a * 3))"
6 4
$ a=a=b++ b=1 bash -c 'echo "$((++a)) $b"'
2 2
算術式では、変数拡張のための間接拡張が存在することがわかっています。しかし、私は理解できません。
a
最初の例の合計はどのように$a
そのような違いをもたらしますか?私の混乱は、算術式で変数にパラメータ拡張を必要とせずに${}
変数を直接作成するという事実から来ています。2番目の例の算術式はどのように評価されますか?
ありがとうございます。
答え1
算術式では、などのテキスト文字列が変数名a
として解釈され、その変数の値が算術式自体として処理され、結果を含む算術式に使用されます。だから
$((a * 3))
a
変数の値が算術式1+1
で評価され、2
全体式はとなります$((2 * 3))
。つまり 6
。
同じ文脈では、前の段階$a
で(a
これパラメータ拡張です。)
$(($a * 3))
になると、一般的な優先順位の規則に従います$((1+1 * 3))
。4
第2の例では、$((++a))
処理が以前に行われる$b
(処理は左から右に進む)。算術式は、a
上記のように算術式自体として評価されます。評価すると、値a
(それ自体は算術式で評価されます)がに割り当てられてから増加します。したがって、評価後はそうです。増分を計算し、その値を返します。現在の値はです。また、値に置き換えてください。参照された引数が処理された後は、唯一の引数として実行され、表示される出力を生成します。a=b++
b
a
b
a
b
2
a
1
$((++a))
a
2
$b
b
2
echo
echo
2 2