Bash将数组作为对函数的引用进行传递时遭到了重击
我正在使用GNUBash版本4.4.12,遇到了一个不寻常的情况。我试图通过引用函数来传递数组。因此,下面的代码按预期工作Bash将数组作为对函数的引用进行传递时遭到了重击,bash,Bash,我正在使用GNUBash版本4.4.12,遇到了一个不寻常的情况。我试图通过引用函数来传递数组。因此,下面的代码按预期工作 function test() { local -n varK=${2} local varJ=$(( ${1} + 10 )) echo "${varJ}, ${varK[@]}" } varI=( 1 2 ) varJ=3 echo "result = '$( test 1 varI )'" # result = '11, 1 2' echo
function test() {
local -n varK=${2}
local varJ=$(( ${1} + 10 ))
echo "${varJ}, ${varK[@]}"
}
varI=( 1 2 )
varJ=3
echo "result = '$( test 1 varI )'" # result = '11, 1 2'
echo "varI = '${varI[@]}'" # varI = '1 2'
echo "varJ = '${varJ}'" # varJ = '3'
奇怪的情况是,如果我在函数中使用变量varI
,即使我将其定义为局部变量,变量varI
也会被破坏
function test() (
local -n varK=${2}
local varI=$(( ${1} + 10 ))
echo "${varI}, ${varK[@]}"
)
varI=( 1 2 )
varJ=3
echo "result = '$( test 1 varI )'" # result = '11, 11'
echo "varI = '${varI[@]}'" # varI = '1 2'
echo "varJ = '${varJ}'" # varJ = '3'
命令
local-nvark=${2}
是否生成通过引用传递的数组的本地副本?另外,如果我在子shell中运行函数(并将其称为子shell,它是否应该像所有文档所声称的那样影响父进程?nameref不知道它所指的名称;它是一个简单的别名。local-n varK=varI
简单地说明,无论何时使用参数名varK
,都要假装它真的是varI
,不管是什么名称的意思是。当您使用varK
时,varI
是一个值为11的局部变量,因此varK
也是如此。(部分混淆可能还在于bash
如何处理与数组语法一起使用的非数组名称;${varI[@]}
和${varI}无论名称上是否设置了数组属性,
都是等效的。)因此,为了在我的函数中使用varI
,并且仍然可以访问引用数组,我制作了引用数组的本地副本:
local varJ=( "${varK[@]}" )