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

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")

관련 정보