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"

関連情報