我很难克服这段man bash
话。
如果循环中的控制变量
for
具有该nameref
属性,则单词列表可以是 shell 变量列表,并且在执行循环时将为列表中的每个单词建立名称引用。数组变量不能被赋予
-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 依次针对单词列表的每个元素来执行。这并不等同于上面的一系列赋值:ref=value
其中ref
is a nameref 的赋值会影响所指向的变量ref
,但 for 循环会更改 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