for 循环中的 shell 变量

for 循环中的 shell 变量

我很难克服这段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其中refis 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

相关内容