以下を使用せずに変数内の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 -n
bash
ksh93
答え2
変数名が識別名と関連属性の組み合わせで指定されている場合は、連想配列を使用する必要があります。 Bash 4.x、ksh、またはzshがあるとします。よりページまたはその他BashGuideから。 (実際にCでこのような構造を作ることは良いですが、Bashでは実際にこれを達成することはできません。)
つまり、ホスト/クラスタのURLとポートを保存するには、、、、oregon
4つの変数をarizona
作成しないで、代わりに次のようにします。arizona_url
arizona_port
oregon_url
oregon_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
ありがとうございます!