如果variables名存储为string,如何获得一个variables值?

我如何检索一个bashvariables值,如果我有variables名string?

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

语境:

我有一些AMI( 亚马逊机器图像 ),我想启动每个AMI的几个实例。 一旦他们完成引导,我想要设置每个实例根据其AMItypes。 我不想在任何AMI内部烧制大量的脚本或秘密密钥,所以我准备了一个通用的启动脚本,并将其放在S3上,并提供了一个可公开访问的链接。 在rc.local中,我放了一小段代码来获取启动脚本并执行它。 这是我在AMI所拥有的一切。 然后,每个AMI访问一个适用于所有AMI的通用configuration脚本和每个AMI的特殊设置脚本。 这些脚本是私有的,需要一个签名的URL来访问它们。

所以,现在,当我触发AMI(my_private_ami_1)的一个实例时,我通过一个签名的URL来显示在S3上显示的另一个文件,其中包含键/值对的所有私有脚本的签名URL。

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

当启动脚本运行时,它会下载上面的文件和source文件。 然后检查它的AMItypes并为自己select正确的设置脚本。

 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 

所以现在我可以有一个通用的代码,不pipe他们的AMItypes是什么都可以触发实例,实例可以自己照顾自己。

您可以使用${!a}

这是一个间接参数扩展的例子:

参数扩展的基本forms是${parameter}parameter的值被replace。

如果parameter的第一个字符是感叹号(!),则引入一个variables间接级别。 Bash使用由其余parameter形成的variables的值作为variables的名称; 这个variables然后被展开,并且该值被用在其余的replace中,而不是parameter本身的值。

 X=foo Y=X eval "Z=\$$Y" 

将Z设置为“foo”

请小心使用eval因为这可能允许通过${Y}值encryption代码。 这可能会通过代码注入造成伤害。

例如

 Y="\`touch /tmp/eval-is-evil\`" 

会创build/tmp/eval-is-evil 。 当然,这也可能是一些rm -rf /

修改我的search关键字,并得到它:)。

 eval a=\$$a 

谢谢你的时间。

现代的shell已经支持数组(甚至是关联数组)。 所以请使用它们,并使用较less的评估。

 var1="this is the real value" array=("$var1") # or array[0]="$var1" 

那么当你想调用它时,echo $ {array [0]}