算術式で間接拡張を使用した変数拡張の2つの例について学びます。

算術式で間接拡張を使用した変数拡張の2つの例について学びます。

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++babab2a1$((++a))a2$bb2echoecho2 2

関連情報