我很想知道 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
本质上是一个空操作;您已经在 nameref
上设置了 z
属性;第二次这样做没有任何改变。
第一次使用
declare
时,z
未初始化且未定义。对 z
的 first赋值(无论是在对
declare
的调用中还是在其后续调用中)确定 z
引用的是哪个变量。
$ declare -n z
$ echo $z
$ z=somevalue
$ declare -p z
declare -n z=somevalue
此时 echo $z
不会产生任何值,因为 somevalue
本身未定义。
您的第二次声明调用实际上对
z
:没有任何作用
$ declare -n z
$ declare -p z
declare -n z=somevalue
它仍然是对变量
somevalue
的引用。但现在你对 z
的第二次赋值做了不同的事情:它为变量 somevalue
分配了一个值,这样现在当你执行 echo $z
时,你会看到变量 somevalue
的值,就像你有写了echo $somevalue
。
如果我们对两个赋值使用不同的值,那么混乱会少一些,因此我们可以区分引用的变量及其值。
$ declare -n z
$ z=foo
$ declare -p z
declare -n z=foo
$ z=9
$ echo $foo
9