Bash 执行字符串的变量扩展

Bash 执行字符串的变量扩展

我正在尝试建立两层间接层,但请告诉我我是否是该问题的受害者XY问题

我想要实现的目标的简要解释

> test1=\$test2
> test2="string to print"
> echo $test2
string to print
> echo $test1
$test2

这一切都有道理,但我是使用 执行命令$test1并打印出来string to print。我的直觉反应是这应该有效

> echo $(echo $test1)
$test2

胡说。还有其他人知道这是否可能吗?

更详细地解释为什么我希望实现这一目标

我想创建一个文本文件模板,$variables其中包含可重复用于生成许多文本文件的模板。我的想法是:设置环境变量,处理模板文件并输出到另一个文件。

例子:

> #set vars
> cat template.txt | magic_var_expansion_cmd > out1.txt
> #set vars
> cat template.txt | magic_var_expansion_cmd > out2.txt
> #set vars
> cat template.txt | magic_var_expansion_cmd > out3.txt

这显然可以在脚本中以更复杂的方式使用,但这就是MVP在我的脑海里。

答案1

$ test1="hello"
$ test2="test1"

$ echo "${!test2}"
hello

bash手册中:

如果parameter的第一个字符是感叹号( !),并且parameter不是nameref,则它引入了一层变量间接寻址。 Bash 使用由参数的其余部分形成的变量的值作为变量的名称;然后扩展该变量,并在其余替换中使用该值,而不是参数本身的值。这称为间接扩展。如果参数是 nameref,则它将扩展为参数引用的变量的名称,而不是执行完整的间接扩展。例外情况是 下面描述的${!prefix*}扩展。${!name[@]}感叹号必须紧跟在左大括号之后才能引入间接关系。

对于问题的第二部分,我可能会尝试避免在模板中使用实际的 shell 变量,而是使用易于解析的占位符并使用sed.

还有一些类似的问题,包括“如何用文件中的内容替换文档中的占位符字符串“,”从模板创建文本文件的工具“ 和 ”如何替换文本文件中的占位符列表?“(还有其他的)。

答案2

使用评估

$ test1=\$test2
$ test2="string to print"
$ echo $test2
string to print
$ eval echo $test1
string to print

相关内容