이름을 변수로 참조하여 bash 배열을 검색합니다.

이름을 변수로 참조하여 bash 배열을 검색합니다.

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 스크립팅 가이드.

글쎄,
안전상의 이유로 평가가 추악합니다.
더 나은 것을 찾아보십시오 ...

관련 정보