小编典典

如果变量名存储为字符串,如何获取变量值?

all

如果我将变量名作为字符串,如何检索 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 上显示的另一个文件传递了一个签名
URL,该文件包含所有私有脚本的键/值对的签名 URL。

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

当启动脚本运行时,它会下载上面的文件并且source‘s it. 然后它检查其 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 类型如何,并且实例可以自行处理。


阅读 60

收藏
2022-07-29

共1个答案

小编典典

您可以使用${!a}

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

这是间接参数扩展的示例:

参数展开的基本形式是${parameter}。的值 parameter被替换。

如果 的第一个字符parameter是感叹号 (!),则它引入了变量间接级别。Bash
使用由其余部分形成的变量的值作为变量parameter的名称;然后扩展此变量,并将该值用于替换的其余部分,而不是其parameter自身的值。

2022-07-29