算術拡張とパラメータ拡張

算術拡張とパラメータ拡張
$ x=foo; foo=bar; bar=6; 

$ echo $x
foo

$ echo $((x))
6

算術拡張が値で停止せず、変数からx値へfoo、変数からfoo値へbar、そして変数から値へと追跡されるのはなぜですか?foo6foox

整数に達するか何も到達しないまで、eval 変数のパラメータ拡張に算術拡張が無限に適用されるように見えますか?x

ベストアンサー1

bashこれは、算術式で再利用するためにシェル変数に無効な整数定数を含めることができるzsh拡張(およびその派生)です。ksh

bashシェル算術から:

シェル変数はオペランドとして受け入れられます。パラメータ拡張は式の評価前に行われます。式内では、シェル変数はパラメーター拡張構文を使用せずに名前で参照することもできます。 nullまたは設定されていないシェル変数は、パラメータ拡張構文を使用せずに名前で参照すると0に評価されます。変数が参照されるか、または「declare -i」を使用して整数属性が割り当てられた変数に値が割り当てられると、変数の値は算術式として評価されます。 null 値は 0 と評価されます。シェル変数は、整数プロパティを設定しなくても式で使用できます。

したがって、あなたの場合は$((x))最初に間違った整数xに拡張されるため、変数名参照として再利用されます。次に、拡張して有効な整数を取得するまで上記のプロセスを繰り返します。foofoofoobar6


POSIX仕様では、$((x))有効な整数定数の場合にのみ$(($x))同じ値が返されることを指定します。無効な整数の場合xについては何も言わないので、シェル実装ではこの場合を自由に処理できます。x

結果はシェルによって異なる場合があります。

zshkshそしてその派生物は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

おすすめ記事