1. ホーム
  2. string

[解決済み] 変数名が文字列で保存されている場合、変数値を取得する方法は?

2022-04-20 11:29:57

質問

bashの変数名を文字列として持っている場合、どのように値を取得することができますか?

var1="this is the real value"
a="var1"
Do something to get value of var1 just using variable a.

コンテキスト

いくつかのAMIがあるのですが( アマゾン・マシン・イメージ ) で、それぞれのAMIのインスタンスをいくつか起動させたいと思います。起動が終わるとすぐに、各インスタンスをAMIの種類に応じてセットアップしたいと思います。AMIの中にたくさんのスクリプトや秘密鍵を入れたくないので、一般的な起動スクリプトを用意して、それを S3 というリンクで公開されています。rc.localには、起動スクリプトを取得して実行する小さなコード片を置きました。AMIに入れるのはこれだけです。それから、各AMIはすべてのAMIに適用される共通の設定スクリプトと、それぞれのAMI用の特別な設定スクリプトにアクセスします。これらのスクリプトはプライベートなもので、アクセスするには署名されたURLが必要です。

そこで、あるAMI(my_private_ami_1)のインスタンスを起動するときに、S3上に提示されたもう1つのファイルに対して署名付きURLを渡します。このファイルには、すべてのプライベートスクリプトの署名付きURLがキーと値のペアで格納されています。

config_url="http://s3.amazo.../config?signature"
my_private_ami_1="http://s3.amazo.../ami_1?signature"
...

起動スクリプトが実行されると、上記のファイルがダウンロードされ source を作成します。そして、AMIの種類をチェックし、自分用に正しいセットアップスクリプトを選びます。

ami\_type=GET AMI TYPE #ex: sets ami\_type to my\_private\_ami\_1
setup\_url=GET THE SETUP FILE URL BASED ON AMI\_TYPE # this is where this problem arises

これで、AMIの種類に関係なくインスタンスを起動できる汎用的なコードができ、インスタンスも自分自身で管理できるようになりました。

どのように解決するのですか?

を使用することができます。 ${!a} :

var1="this is the real value"
a="var1"
echo "${!a}" # outputs 'this is the real value'

これは、間接的な例です。 パラメータ展開 :

パラメータ展開の基本形は ${parameter} . の値は parameter が代入される。

の最初の文字が parameter が感嘆符(!)である場合、それは は、変数のインダイレクトのレベルを導入しています。Bashは の残りの部分から形成される parameter の名前として使用します。 この変数が展開され、その値が の値ではなく、残りの代入を行います。 parameter そのものである。