Bash 확장에 대한 도움이 필요합니다.
배열 값 GNU bash 5.1.0을 검색하고 싶습니다. 배열 이름은 변수여야 합니다. bash에서 변수를 참조하는 "그냥"입니다.
$gral 변수에 이름이 있는 "armin"이라는 배열이 있습니다(잘 작동함).
gral="armin"
과제:
declare -a ${gral}[1]="milk"
declare -a ${gral}[2]="cow"
declare ${gral}[7]="budgie"
declare ${gral}[9]="pla9ne"
아름다운.
배열이 존재합니다:
$ echo ${armin[@]}
milk cow budgie pla9ne
배열 인덱스가 존재합니다:
$echo ${!armin[@]}
1 2 7 9
배열과 인덱스는 괜찮습니다.
배열을 참조하여 배열을 검색하고 싶습니다.변수로 이름 지정, 수동이 아닌.
이전에 설정되고 사용된 변수가 많이 있습니다 .
$ echo $gral
armin ## name of our bash array
너무 좋아요 – 지금까지는요.
변수를 사용하지 않고 차이점을 표시하려면 다음을 수행하십시오.
echo ${armin[@]}
milk cow budgie pla9ne
이제 변수(gral)를 참조하여 이름(armin)을 호출해 보십시오.
$ echo ${$gral[@]}
-bash: ${$gral[@]}: wrong substitution.
$echo ${"$gral"[@]}
-bash: ${"$gral"[@]}: wrong substitution.
echo ${"gral"[@]}
-bash: ${"gral"[@]}: wrong substitution.
echo ${${gral}[@]}
-bash: ${${gral}[@]}: wrong substitution.
모두 실패했습니다. "eval"도 시도했습니다. 연관(statement-A)을 사용해도 아무런 차이가 없습니다.
참고: 인덱싱은 이 방법으로 문제 없이 잘 작동합니다. 이름이 문제네요.
뭔가 빠진 것 같아요. 아마도 대답은 이전에 설명되었을 것입니다. 배열의 변수에 대한 흥미로운 내용을 많이 찾았지만 내 과제에 대한 답을 식별하지 못했습니다.
할 수 있나요배열 이름을 변수로 참조하여 배열을 검색하는 용어를 찾는 데 도움을 주세요.?
답변1
nameref 사용(Bash >= 4.3):
$ armin=(foo bar doo)
$ declare -n gral=armin # 'gral' references array 'armin'
$ gral[123]=quux # same as 'armin[123]=quux'
$ echo "${gral[@]}"
foo bar doo quux
$ echo "${gral[1]}"
bar
$ echo "${!gral[@]}" # listing the indexes works too
0 1 2 123
또한보십시오:Bash는 포인터 사용을 지원합니까?
답변2
@ilkkachu가 답변했듯이 namerefs는 여기서 사용되는 도구입니다. 이를 통해 배열을 함수에 전달하는 것이 매우 쉽습니다. 예를 들어:
dumpArray() {
local -n ary=$1
for i in "${!ary[@]}"; do
printf "%s\t%s\n" "$i" "${ary[$i]}"
done
}
이 함수는 배열과 연관 배열을 처리할 수 있습니다.
$ declare -a armin=([1]=milk [2]=cow [7]=bugle [9]=pla9ne)
$ dumpArray armin
1 milk
2 cow
7 bugle
9 pla9ne
$ declare -A map=([foo]=bar [baz]=qux)
$ dumpArray map
foo bar
baz qux
유일한 실제 문제는 nameref가 동일한 이름을 가진 배열을 참조하도록 하는 것이 혼란스럽다는 것입니다.
$ ary=(a b c)
$ dumpArray ary
bash: local: warning: ary: circular name reference
bash: warning: ary: circular name reference
bash: warning: ary: circular name reference
bash: warning: ary: circular name reference
bash: warning: ary: circular name reference
0 a
bash: warning: ary: circular name reference
bash: warning: ary: circular name reference
1 b
bash: warning: ary: circular name reference
bash: warning: ary: circular name reference
2 c
따라서 함수에서 배열에 다음과 같은 이상한 이름을 지정합니다.
dumpArray() {
local -n __dumpArray_ary=$1
do_stuff_with "${__dumpArray_ary[@]}"
}
답변3
[@]
이름이 포함된 변수에 "인덱스"를 포함합니다. 예:
ref=$gral'[@]'
printf '%s\n' "${!ref}"
산출:
milk
cow
budgie
pla9ne
공백이 포함된 값에도 작동합니다.
답변4
글쎄,
대답은변수로 전달된 이름으로 배열 역참조(부분적으로 포인터와 유사)
는 (위의 예를 재사용):
eval echo "\$$(eval echo "{$gral[@]}")"
$gral은 배열 이름을 저장합니다.
결과:
소 사랑앵무 pla9ne
이제 이 솔루션을 확장하여 인덱스 항목을 사용하여 bash 배열(인덱싱된 및 연관) 콘텐츠를 반복할 수 있습니다.
답을 찾아서 너무 기뻐요. 모두의 도움에 감사드립니다!
변수의 내용에 액세스합니다.
ABS 가이드에는 결과로 이어지는 팁이 있습니다.
https://tldp.org/LDP/abs/html/abs-guide.html#IVR
Mendel Cooper의 기여에 감사드립니다.고급 Bash 스크립팅 가이드.
글쎄,
안전상의 이유로 평가가 추악합니다.
더 나은 것을 찾아보십시오 ...