まれな配列

まれな配列

Bashのマニュアルページでは、名前付き${!a}変数の内容を返す方法(間接レベル)について説明します。a

これを使って配列のすべての要素を返す方法を知りたいです。

a=(one two three)
echo ${a[*]}

返品

one two three

私が欲しい:

b=a
echo ${!b[*]}

同じものを返します。残念ながらそうではなく、代わりに返されます0

修正する

答えを聞いてみると、私の例は次のように単純すぎるということに気づきました。

b=("${a[@]}")

私が必要だと言うすべてを達成します。

だからこれは私の状況です。努力するすること:

LIST_lys=(lys1 lys2)
LIST_diaspar=(diaspar1 diaspar2)

whichone=$1   # 'lys' or 'diaspar'

_LIST=LIST_$whichone
LIST=${!_LIST[*]}

もちろん、Bashのマニュアルページを詳しく見てみると、最後の行は単に「配列」のインデックス$_LIST(まったく配列ではない)を返すので、これは期待どおりに機能しないことがわかります。

とにかく、以下は(指示どおり)操作を実行する必要があります。

LIST=($(eval echo \${$_LIST[*]}))

または...(私が選択したパス):

LIST_lys="lys1 lys2"
...
LIST=(${!_LIST})

もちろん、これは要素にスペースが含まれていないと仮定します。

ベストアンサー1

私はbash変数への間接参照の使用を文字通り受け入れるべきだと思います。

例えば。元の例の場合:

a=(one two three)
echo ${a[*]} # one two three
b=a
echo ${!b[*]} # this would not work, because this notation 
              # gives the indices of the variable b which
              # is a string in this case and could be thought
              # as a array that conatins only one element, so
              # we get 0 which means the first element
c='a[*]'
echo ${!c} # this will do exactly what you want in the first
           # place

最後の実際のシナリオでは、以下のコードがこれを行うと信じています。

LIST_lys=(lys1 lys2)
LIST_diaspar=(diaspar1 diaspar2)

whichone=$1   # 'lys' or 'diaspar'

_LIST="LIST_$whichone"[*]
LIST=( "${!_LIST}" ) # Of course for indexed array only 
                     # and not a sparse one

"${var[@]}"混乱$IFSや議論の拡張を避ける表記法を使用することをお勧めします。これが最終コードです。

LIST_lys=(lys1 lys2)
LIST_diaspar=(diaspar1 diaspar2)

whichone=$1   # 'lys' or 'diaspar'

_LIST="LIST_$whichone"[@]
LIST=( "${!_LIST}" ) # Of course for indexed array only 
                     # and not a sparse one
                     # It is essential to have ${!_LIST} quoted

おすすめ記事