要是我们:
- 定义一个数组;进而..
- 定义一个函数;并想要..
- 从函数内部调用该数组..
我们可以。就像这样:
输入:
myArray=('1' '2' '3' '4' '5')
myFunction ()
{
local -n myList="$1";
echo "${myList[@]}";
}
myFunction myArray
输出:
1 2 3 4 5
因此,在 的范围内${myArray[@]}
变为。${myList[@]}
myFunction
但此方法仅适用于bash
4.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")