문자열 값을 기반으로 배열 호출

문자열 값을 기반으로 배열 호출

다음과 같이 문자열 변수로 이름이 정의된 bash 스크립트에서 배열을 호출해야 합니다.

var="array"
array=( 
1
2
3
)

$var는 항상 배열 이름과 같습니다.

#failed attempts at echoing ${array[@]}
echo "${!var}          # returns only the first value of the array

echo "${!var[@]}"      # returns 0

tempvar='${'$var'[@]}' # makes a new variable with value of "${array[@]}"
echo "${!tempvar}"     #returns 'invalid variable name'

저는 이 문제를 처음 접했고 이 문제에 대한 해결책을 찾지 못했습니다. 미리 감사드립니다.

답변1

배쉬 특정

배열을 참조하려면 "nameref"를 사용하세요.declare -n

array=(1 2 3)
var=array

declare -n a=$var

for idx in "${!a[@]}"; do echo "$idx -> ${a[idx]}"; done
a[4]="hello"
declare -p a array     # original altered by above assignment

산출

0 -> 1
1 -> 2
2 -> 3
declare -n a="array"
declare -a array=([0]="1" [1]="2" [2]="3" [4]="hello")

어떤 것을 만들어복사배열에서는 간접 변수를 사용하세요. 보기 흉합니다.

tmp=${var}[@]          # constructing a string
b=( "${!tmp}" )        # indirect variable expansion
b[4]="goodbye"

declare -p tmp b array     # original not changed

산출

declare -- tmp="array[@]"
declare -a b=([0]="1" [1]="2" [2]="3" [3]="hello" [4]="goodbye")
declare -a array=([0]="1" [1]="2" [2]="3" [4]="hello")

"hello" 요소의 인덱스가 어떻게 변경되는지 확인하세요 b. 이는 b=("${!tmp}")배열의 고유 복사본이 생성되기 때문입니다.요소,아니요색인.

답변2

bash에서(ksh에서와 마찬가지로 bash는 배열 디자인을 복사했습니다) 배열은 일반 배열과 동일하지 않지만희소 배열따라서 키가 양의 정수로 제한된 연관 배열과 비슷합니다.

여기에서 다음을 수행할 수 있습니다.

$ array=( [12]=a [23]=b [34]=c )
$ var=array
$ tempvar_for_separated_out_keys='!'$var[@]
$ tempvar_for_separated_out_values=$var[@]
$ printf -- '- <%s>\n' "${!tempvar_for_separated_out_keys}"
bash: !array[@]: invalid variable name
$ printf -- '- <%s>\n' "${!tempvar_for_separated_out_values}"
- <a>
- <b>
- <c>

(예, 핵심은 아직 작동하지 않습니다).

또는 대신 nameref를 사용할 수 있습니다(ksh에서도 사용 가능하지만 약간의 차이가 있음).

$ typeset -n var=array
$ printf -- '- <%s>\n' "${!var[@]}"
- <12>
- <23>
- <34>
$ printf -- '- <%s>\n' "${var[@]}"
- <a>
- <b>
- <c>

zsh또는 매개변수 확장 플래그를 사용하여 역참조가 수행되는 위치 로 전환할 수 있습니다 P. zsh배열은 배열이지만 키가 임의의 문자열(바이트 또는 문자)인 적절한 연관 배열도 있습니다.

$ array=( a b c '' ) var=array
$ printf -- '- <%s>\n' ${(P)var}
- <a>
- <b>
- <c>
$ printf -- '- <%s>\n' "${(P@)var}"
- <a>
- <b>
- <c>
- <>
$ typeset -A hash=( 12 a 23 b 34 c '' empty )
$ var=hash
$ printf -- '- <%s>\n' "${(Pk@)var}"
- <>
- <34>
- <23>
- <12>
$ printf -- '- <%s>\n' "${(Pv@)var}"
- <empty>
- <c>
- <b>
- <a>
$ printf -- '- <%s> -> <%s>\n' "${(Pkv@)var}"
- <> -> <empty>
- <34> -> <c>
- <23> -> <b>
- <12> -> <a>

( k로 표시열쇠, v로 표시됨가치(기본값), @Bourne 쉘에서와 같이 빈 요소를 보존하기 위해 따옴표로 표시됩니다 "$@".

관련 정보