変数の値と文字列を結合して別の変数を形成します。

変数の値と文字列を結合して別の変数を形成します。

以下を使用せずに変数内のbash変数を参照したいと思います。

echo "${!VARNAME}"

どんなアイデアがありますか?変数を動的に使用したいのですが、そのような参照が多いので、他の変数として宣言して使用することはできません。

例:

var1=host
${var1}_file ----> host_file is another variable that i want to call in a command. 

答え1

shスクリプトを書かない限り、変数ではない(間接bash参照)を使用したくない理由を本当に理解していません。

すでに述べたようにeval動作しますが、一般的に使用が危険になる可能性があるため、眉をひきます。特に、慎重にクリーンアップせずにユーザーから提供されたデータを評価する場合は、さらにそうです。

同じ効果を得るもう1つの方法は、名前参照変数(bashバージョン4.3以降で利用可能)を使用することです。

var1=host

declare -n nameref="${var1}_file"

nameref="something something"

printf '%s\n' "$host_file"

これで文字列が出力されますsomething something。とで動作させるには、typeset -n代替を使用します。declare -nbashksh93

答え2

変数名が識別名と関連属性の組み合わせで指定されている場合は、連想配列を使用する必要があります。 Bash 4.x、ksh、またはzshがあるとします。よりページまたはその他BashGuideから。 (実際にCでこのような構造を作ることは良いですが、Bashでは実際にこれを達成することはできません。)

つまり、ホスト/クラスタのURLとポートを保存するには、、、、oregon4つの変数をarizona作成しないで、代わりに次のようにします。arizona_urlarizona_portoregon_urloregon_port

typeset -A urls ports
urls[oregon]="http://..."
urls[arizona]="http://..."
ports[oregon]=1234
ports[arizona]=2345

"${urls[$hostname1]}"それから背中と一緒に使用してください。"${ports[$hostname]}"

答え3

以前の回答によれば、evalを使用してこれを達成できます。

eval [arg ...]引数を読み取り、それを単一のコマンドで連結します。その後、シェルはコマンドを読み取り、実行し、その終了ステータスはeval値として返されます。引数がない場合、またはnullパラメータのみがある場合、evalは0を返します。 (bash マニュアルページから)

しかし、これはよく知られており、できるだけ少なく使用する必要がある悪いプログラムです。通常、よりエレガントでエラーが少なく、デバッグしやすいものを好むことでこれを回避できます。

var1=host
eval echo ${var1}_file # print contents of $host_file

答え4

配列でも動作します!

以下は@Kusalanandaのアプローチの一般化ですが、配列の使用です。

declare -a array_a=()
declare -n array_b="array_a"
for ((i=0;i<=9;i++)); do
    array_b+=($i)
done
length=${#array_a[*]}
for ((i=0;i<=$(($length-1));i++)); do
    echo "${array_a[$i]}"
done

ありがとうございます!

関連情報