bash 的内置 `declare -n z` 对 `z` 参数有什么作用?

问题描述 投票:0回答:1

我很想知道 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

bash built-in declare
1个回答
1
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.