![Bash 변수 간접 참조를 사용할 때 더 많은 배열 멤버에 액세스하는 방법은 무엇입니까?](https://linux55.com/image/139623/Bash%20%EB%B3%80%EC%88%98%20%EA%B0%84%EC%A0%91%20%EC%B0%B8%EC%A1%B0%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EB%95%8C%20%EB%8D%94%20%EB%A7%8E%EC%9D%80%20%EB%B0%B0%EC%97%B4%20%EB%A9%A4%EB%B2%84%EC%97%90%20%EC%95%A1%EC%84%B8%EC%8A%A4%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
인덱스와 잘 작동하는 것처럼 보이는 다음 예를 살펴보세요 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]}"
명명된 배열의 요소에 대한 참조입니다.3
y
질문과 같이 배열을 반복하려면 x
nameref를 만드십시오.
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]}"
작동하는 것처럼 보이는 이유는 x
과 x[0]
동일하다는 것입니다. (폭발 없이) 루프가 있는 경우 , , 와 같은 결과를 echo "${x[0]}"
얻게 됩니다 .a1
a2
echo "$x"