我正在尝试建立两层间接层,但请告诉我我是否是该问题的受害者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