如何解决将局部名称引用分配给函数中的局部变量时的奇怪行为
我花了很多时间试图理解下面描述的行为,但是没有成功。请考虑以下代码:
cut
输出为:
#!/bin/bash
function Dummy() {
local -n namerefArray="$1"
local -a -i myArray=("${namerefArray[@]}")
local -p
}
declare -a -i myArray=('1' '2' '3')
Dummy 'myArray'
也就是说,函数主体第二行中的赋值会破坏名称引用所引用的变量的内容。
最初,这让我挠了挠头,直到我了解到这条线实际上扩展到了
root@cerberus:~/scripts# ./test6
myArray=()
namerefArray=myArray
如果local -a -i myArray=("${myArray[@]}")
是$1
,如示例所示。因此,我要为其分配一个(尚未定义的)数组变量(准确地说是其扩展名)。
很明显,在函数中,myArray
不能区分本地变量和nameref变量,如果引用的变量与本地变量具有相同的名称。到目前为止,一切都很好(相反,到目前为止,如此糟糕,因为这实际上使名称引用毫无价值,但这是另一个故事,而不是问题的主题)。
然后我尝试了以下代码:
bash
请注意,它实际上与第一个示例相同,只是在函数正文的第二行中缺少#!/bin/bash
function Dummy() {
local -n namerefArray="$1"
local myArray=("${namerefArray[@]}")
local -p
}
declare -a -i myArray=('1' '2' '3')
Dummy 'myArray'
。
但是现在的输出是:
-a -i
也就是说,这一次已按预期复制了数组,并且尚未清空nameref引用的变量。
有人可以解释一下为什么功能体第二行中的root@cerberus:~/scripts# ./test6
myArray=([0]="1" [1]="2" [2]="3")
namerefArray=myArray
有如此重要的意义吗?我真的很想了解。
更新
这最初是由-a -i
在最新的香草debian Stretch安装中发生的。 同时,我在最新的debian buster安装中使用bash 4.2.12
进行了尝试,结果完全相同。
我几乎无法想象这样的错误至少要三年才能解决,所以这可能是预期的行为吗?
更新2
与此同时,我什至尝试使用bash 5.0.3
,结果相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。