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