매개변수를 스크립트의 내부 배열 이름으로 사용하는 방법은 무엇입니까?

매개변수를 스크립트의 내부 배열 이름으로 사용하는 방법은 무엇입니까?

아래와 같이 array_call_self.sh라는 스크립트를 작성하면

#!/bin/bash
declare -A num word
word=(
 [a]='index_a'
 [b]='index_b'
 [c]='index_c'
)
num=(
 [a]=1
 [b]=2
 [c]=3
)
array=${$1[@]}
for i in ${$array[@]};do
  echo $i
done

내가 실행하면 bash array_call_self.sh word 그것은 나를 반환합니다

test.sh: line 13: ${$1[@]}: bad substitution
test.sh: line 14: ${$array[@]}: bad substitution

답변1

이름으로 변수를 참조하고 싶을 수도 있습니다( bash버전 4.3 이상에서 사용 가능).

#!/bin/bash

declare -A num word

word=(
 [a]='index_a'
 [b]='index_b'
 [c]='index_c'
)

num=(
 [a]=1
 [b]=2
 [c]=3
)

declare -n var="$1"

printf '%s\n' "${var[@]}"

이는 변수를 var이름 참조 변수로 선언하고 스크립트의 첫 번째 인수로 명명된 변수를 참조합니다. 첫 번째 인수가 변수의 유효한 이름이 아니거나 name 인 경우 var오류가 발생합니다.

변수 이름을 선언 하고 할당한 후에는 일반적으로 지정된 변수의 값에 액세스하는 것과 마찬가지로 var값에 액세스합니다 .var

제공되니 참고해주세요변수 이름스크립트의 명령줄에서는 사용할 수 없기 때문에 적절한 명령줄 구문 분석을 수행하여 이러한 구현 세부 정보를 숨기고 유효한 인수를 제한된 목록으로 제한할 수 있습니다. 위의 코드를 사용하면 스크립트 사용자가 출력할 수 있습니다.스크립트의 모든 변수.

값을 유한 목록으로 제한하는 간단한 방법:

case $1 in
        (word|num) ;; # ok
        (*)
                echo 'error' >&2
                exit 1
esac

declare -n var="$1"

관련 정보