Bash 변수 간접 참조를 사용할 때 더 많은 배열 멤버에 액세스하는 방법은 무엇입니까?

Bash 변수 간접 참조를 사용할 때 더 많은 배열 멤버에 액세스하는 방법은 무엇입니까?

인덱스와 잘 작동하는 것처럼 보이는 다음 예를 살펴보세요 0.

$ a1=(1 2 3)
$ a2=(a b c)
$ for x in a1 a2; do echo "${!x}"; done
1
a
$ for x in a1 a2; do echo "${!x[0]}"; done
1
a

그러나 인덱싱을 사용하면 1아무것도 인쇄되지 않습니다.

$ for x in a1 a2; do echo "${!x[1]}"; done    

배열은 그 자체로 괜찮습니다.

$ echo "${a1[1]} ${a2[1]}"
2 b

편집 - 실제 사용 사례 기반이르카초답변

SHIBB=(https://shibboleth.net/downloads/service-provider/3.0.2/ shibboleth-sp-3.0.2 .tar.gz)
XERCES=(http://apache.mirrors.nublue.co.uk//xerces/c/3/sources/ xerces-c-3.2.1 .tar.gz)
XMLSEC=(http://apache.mirror.anlx.net/santuario/c-library/ xml-security-c-2.0.1 .tar.gz)
XMLTOOL=(http://shibboleth.net/downloads/c++-opensaml/latest/ xmltooling-3.0.2 .tar.gz)
OPENSAML=(http://shibboleth.net/downloads/c++-opensaml/latest/ opensaml-3.0.0 .tar.gz)

typeset -n x
for x in XERCES XMLSEC XMLTOOL OPENSAML SHIBB; do
  url="${x[0]}" app="${x[1]}" ext="${x[2]}"
  [ -f "./${app}${ext}" ] || wget "${url}${app}${ext}"
  tar -xf "./${app}${ext}"
  cd "./${app}" && ./configure && make -j2 && make install && ldconfig
  cd ..
done

답변1

"${!x[1]}"1배열 index 의 요소를 사용하는 간접 참조입니다 x.

$ foo=123; bar=456; x=(foo bar); echo "${!x[1]}"
456

현재 버전의 Bash(4.3 이상)에서는 namerefs를 사용하여 원하는 것을 얻을 수 있습니다.

$ a=(00 11 22 33 44)
$ typeset -n y=a
$ echo "${y[3]}"
33

즉, nameref가 설정되면 이는 "${y[3]}"명명된 배열의 요소에 대한 참조입니다.3y


질문과 같이 배열을 반복하려면 xnameref를 만드십시오.

a1=(1 2 3); a2=(a b c)
typeset -n x;
for x in a1 a2; do
    echo "${x[1]}"
done

루프에 의해 수행된 할당은 for자체 값을 변경합니다 x(참조가 가리키는 항목 변경). 일반 할당( x=123, 또는 x[1]=123)은 현재 참조되는 변수를 변경합니다 x. 따라서 a1[1]합계 는 a2[1]다음과 같이 변경됩니다 foo.

typeset -n x;
for x in a1 a2; do
    x[1]=foo
done

"${!x[0]}"작동하는 것처럼 보이는 이유는 xx[0]동일하다는 것입니다. (폭발 없이) 루프가 있는 경우 , , 와 같은 결과를 echo "${x[0]}"얻게 됩니다 .a1a2echo "$x"

관련 정보