Bash传递数组作为函数的引用被破坏

时间:2018-05-16 17:26:39

标签: bash

我正在使用GNU bash版本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 "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 -n varK=${2}是否通过引用传递了数组的本地副本?另外,如果我在子shell中运行该函数(并将其作为子shell调用,它是否应该像所有文档声明的那样影响父进程?

2 个答案:

答案 0 :(得分:0)

nameref对它所引用的名称一无所知;这是一个简单的别名。 local -n varK=varI只是声明无论何时使用参数名称varK,假装它都是varI,无论该名称是什么意思。当您使用varK时,varI是一个值为11的局部变量,因此varK也是如此。 (部分混淆还可能在于bash如何处理与数组语法一起使用的非数组名称; ${varI[@]}${varI}是否等效,无论是否在名称上设置了数组属性。)

答案 1 :(得分:0)

因此,为了在我的函数中使用varI并仍然可以访问引用的数组,我创建了引用数组的本地副本:

local varJ=( "${varK[@]}" )