bash' 内置函数 declare -n z 对 z 参数有何作用?

What does the bash' builtin declare -n z do with the z parameter?

我很想知道 bash' declare -n 选项在只给出一个参数时如何工作。

例如:

declare -n z
echo "${z}"  # ""          (empty string as expected)
z="somevalue"
echo "${z}"  # ""          (empty string)

declare -n z
echo "${z}"  # ""          (empty string)
z="somevalue"
echo "${z}"  # somevalue   (huwh? How come z is now assigned a value?)

为什么第二个 declare 调用似乎取消了 nameref 属性? 为什么第二个赋值操作似乎 工作 但第一个没有?

我正在使用 bash 版本 5.0.17(1)-release

TL;DR:第一个赋值固定了变量 z 所指的。第二个赋值改变了那个变量的值。第二次调用 declare 本质上是空操作;您已经在 z 上设置了 nameref 属性;第二次这样做没有任何改变。


第一次使用declare时,z是未初始化和未定义的。对 zfirst 赋值(无论是在对 declare 的调用中还是在它之后)决定了 z 指的是哪个变量。

$ declare -n z
$ echo $z

$ z=somevalue
$ declare -p z
declare -n z=somevalue

echo $z 此时不产生任何值,因为 somevalue 本身是未定义的。

你的 second 调用 declare 对 z:

没有任何作用
$ declare -n z
$ declare -p z
declare -n z=somevalue

它仍然是对变量 somevalue 的引用。但是现在你对 z 的第二次赋值做了一些不同的事情:它给变量 somevalue 赋值,所以现在当你做 echo $z 时,你会看到变量 [=23] 的值=],就好像你写了 echo $somevalue.

如果我们对两个赋值使用不同的值,那么混淆会少一些,这样我们就可以区分引用变量及其值。

$ declare -n z
$ z=foo
$ declare -p z
declare -n z=foo
$ z=9
$ echo $foo
9