인덱스와 잘 작동하는 것처럼 보이는 다음 예를 살펴보세요 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"