
$ x=foo; foo=bar; bar=6;
$ echo $x
foo
$ echo $((x))
6
算術拡張が値で停止せず、変数からx
値へfoo
、変数からfoo
値へbar
、そして変数から値へと追跡されるのはなぜですか?foo
6
foo
x
整数に達するか何も到達しないまで、eval
変数のパラメータ拡張に算術拡張が無限に適用されるように見えますか?x
答え1
bash
これは、算術式で再利用するためにシェル変数に無効な整数定数を含めることができるzsh
拡張(およびその派生)です。ksh
シェル変数はオペランドとして受け入れられます。パラメータ拡張は式の評価前に行われます。式内では、シェル変数はパラメーター拡張構文を使用せずに名前で参照することもできます。 nullまたは設定されていないシェル変数は、パラメータ拡張構文を使用せずに名前で参照すると0に評価されます。変数が参照されるか、または「declare -i」を使用して整数属性が割り当てられた変数に値が割り当てられると、変数の値は算術式として評価されます。 null 値は 0 と評価されます。シェル変数は、整数プロパティを設定しなくても式で使用できます。
したがって、あなたの場合は$((x))
最初に間違った整数x
に拡張されるため、変数名参照として再利用されます。次に、拡張して有効な整数を取得するまで上記のプロセスを繰り返します。foo
foo
foo
bar
6
POSIX仕様では、$((x))
有効な整数定数の場合にのみ$(($x))
同じ値が返されることを指定します。無効な整数の場合x
については何も言わないので、シェル実装ではこの場合を自由に処理できます。x
結果はシェルによって異なる場合があります。
zsh
、ksh
そしてその派生物はbash
上記と同様に動作します(ビジボックスも同様ですsh
)。
ash
、無効な整数が含まれているとdash
エラーが発生します。x
$ x=foo foo=bar bar=6 dash -c 'echo "$((x))"'
dash: 1: Illegal number: foo
yash
変数をそのままにしてください。
$ x=foo foo=bar bar=6 yash -c 'echo "$((x))"'
foo