もし我々:
- 次に配列を定義します。
- 機能を定義したい。
- 関数内でこの配列を呼び出します。
私たちはできます。このように:
入力する:
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")
名前参照の逆
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")