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
是未初始化和未定义的。对 z
的 first 赋值(无论是在对 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
我很想知道 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
是未初始化和未定义的。对 z
的 first 赋值(无论是在对 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