In older bashes, you need "variable indirection" (4th paragraph of Shell Parameter Expansion),
which is really ugly for arrays:
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
Note that this gives you a copy of the array. Any modifications you make in the function will not alter myArray
in the outer scope:
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")
As opposed to 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")