変数を値で参照して変数にアクセスする方法はありますか?
BAR=("hello", "world")
function foo() {
DO SOME MAGIC WITH $1
// Output the value of the array $BAR
}
foo "BAR"
おそらく、あなたが探しているのは間接的な拡張です。からman bash
:
パラメータの最初の文字が感嘆符 (!) である場合、変数の間接化のレベルが導入されます。Bash は、パラメーターの残りの部分から形成された変数の値を変数の名前として使用します。この変数は展開され、その値はパラメーター自体の値ではなく、残りの置換で使用されます。これは間接展開として知られています。これに対する例外は、以下で説明する ${!prefix*} および ${!name[@]} の展開です。インダイレクションを導入するために、感嘆符は左中括弧の直後に置く必要があります。
関連ドキュメント:シェル パラメーター展開 (Bash マニュアル)および 間接/参照変数の評価 (BashFAQ)。
これが例です。
$ MYVAR="hello world"
$ VARNAME="MYVAR"
$ echo ${!VARNAME}
hello world
配列の間接的な展開は少し面倒であることに注意してください (${!name[@]}
他の意味があるためです。上記のリンクされたドキュメントを参照してください)。
$ BAR=("hello" "world")
$ v="BAR[@]"
$ echo ${!v}
hello world
$ v="BAR[0]"
$ echo ${!v}
hello
$ v="BAR[1]"
$ echo ${!v}
world
これを質問のコンテキストに入れるには:
BAR=("hello" "world")
function foo() {
ARR="${1}[@]"
echo ${!ARR}
}
foo "BAR" # prints out "hello world"
配列構文の間接展開は、古いバージョンの bash (v3 より前) では機能しません。BashFAQ 記事を参照してください。
配列サイズの取得には使用できないようです。ARR="#${1}[@]"
動作しないでしょう。ただし、配列が極端に大きくない場合は、配列のコピーを作成することで、この問題を回避できます。例えば:
function foo() {
ORI_ARRNAME="${1}[@]"
local -a ARR=(${!ORI_ARRNAME}) # make a local copy of the array
# you can now use $ARR as the array
echo ${#ARR[@]} # get size
echo ${ARR[1]} # print 2nd element
}
BAR=("hello", "world")
function foo() {
eval echo "\${$1[@]}"
}
foo "BAR"
配列を名前と一致する辞書に入れることができます。次に、この辞書を検索して配列を見つけ、その内容を表示できます。