インデックスとうまく機能するように見える次の例を見てください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"