다음과 같이 문자열 변수로 이름이 정의된 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 쉘에서와 같이 빈 요소를 보존하기 위해 따옴표로 표시됩니다 "$@"
.