forループのシェル変数

forループのシェル変数

私はこの詩をめくるのに苦労しましたman bash

ループの制御変数にforこのnameref属性がある場合、単語リストはシェル変数リストになり、ループが実行されると、リスト内の各単語に名前参照が設定されます。

配列変数に属性を割り当てることはできません-n。ただし、nameref変数は配列変数と添字配列変数を参照できます。

namerefループでこの変数の例を示し、説明を提供できますか?

答え1

nameref変数は「一般」変数のものであり、一般ファイルへのシンボリックリンクは何ですか?

$ typeset -n ref=actual; ref=foo; echo "$actual"
foo

forループは、リスト内の各単語に順番にバインドされたループ変数(「制御変数」)を使用して、ループの本文を実行します。

$ for x in one two three; do echo "$x"; done
one
two
three

これは連続割り当てを作成するのと同じです。

x=one; echo "$x"
x=two; echo "$x"
x=three; echo "$x"

ループ変数がnamerefの場合、namerefを使用して単語リストの各要素に対してボディが順番に実行されます。これは上記の一連の割り当てと同じではありません。 is a namerefref=value割り当てrefは を指す変数に影響しますが、reffor ループは参照に沿って指す変数を変更するのではなく、nameref が指す位置を変更します。

$ original=0; one=1; two=2; three=3
$ typeset -n ref=original
$ echo $ref
0
$ for ref in one two three; do echo "$ref"; done
1
2
3
$ echo original
0

ループ変数に割り当てると、割り当てによる間接アドレス指定も観察できます(一般的ではありませんが許可されています)。

$ one=1; two=2; three=3
$ typeset -n ref
$ for ref in one two three; do echo ref=$((ref+10)); done
$ echo "$one $two $three"
11 12 13

最後の文では、namerefのターゲットが配列になる可能性があることを説明します。 nameref自体は配列ではなく、まだスカラー変数ですが、代入または逆参照に使用される場合、指す変数の型のように動作します。

$ a=(0 1 2)
$ typeset -n ref=a
$ ref[1]=changed
$ echo "${a[@]}"
0 changed 2

関連情報