bash4.3之前如何用函数引用数组

bash4.3之前如何用函数引用数组

要是我们:

  1. 定义一个数组;进而..
  2. 定义一个函数;并想要..
  3. 从函数内部调用该数组..

我们可以。就像这样:


输入:

myArray=('1' '2' '3' '4' '5')

myFunction () 
{ 
local -n myList="$1";
echo "${myList[@]}";
}

myFunction myArray

输出:

1 2 3 4 5

因此,在 的范围内${myArray[@]}变为。${myList[@]}myFunction

但此方法仅适用于bash4.3.x 版本。

我们如何(以及如何能够)对旧版本做到这一点?

答案1

在较旧的 bash 中,您需要“变量间接”(第 4 段)外壳参数扩展),这对于数组来说真的很难看:

myArray=('1' '2' '3' '4' '5')
myFunction() {
    local arr="${1}[@]"         # array expansion *as a string*
    local values=( "${!arr}" )  # actual array expansion
    echo "${values[@]}"
}
myFunction myArray
1 2 3 4 5

请注意,这会给你一个复制数组的。您在该函数中所做的任何修改都会不是改变myArray外部范围:

myFunc2_old () {
    local arr="${1}[@]"
    local values=( "${!arr}" )  # here's the copy
    values[0]=foo
    declare -p values
}
myFunc2_old myArray; declare -p myArray
declare -a values=([0]="foo" [1]="2" [2]="3" [3]="4" [4]="5")
declare -a myArray=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")

与 namerefs 相反

myFunc2_ref () {
    local -n arr=$1
    arr[0]=foo
    declare -p arr
}
myFunc2_ref myArray; declare -p myArray
declare -n arr="myArray"
declare -a myArray=([0]="foo" [1]="2" [2]="3" [3]="4" [4]="5")

相关内容