我试图有两层间接,但如果我是XY 问题的受害者,请告诉我
> test1=\$test2
> test2="string to print"
> echo $test2
string to print
> echo $test1
$test2
Run Code Online (Sandbox Code Playgroud)
这一切都说得通,但我想要的是使用$test1
并打印出执行命令string to print
。我的直觉反应是这应该有效
> echo $(echo $test1)
$test2
Run Code Online (Sandbox Code Playgroud)
胡说。有谁知道这是否可能?
我想创建一个包含$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
Run Code Online (Sandbox Code Playgroud)
这显然可以用在脚本中,并以更复杂的方式使用,但这是我心目中的MVP。
Kus*_*nda 11
$ test1="hello"
$ test2="test1"
$ echo "${!test2}"
hello
Run Code Online (Sandbox Code Playgroud)
从bash
手册:
如果参数的第一个字符是感叹号 (
!
),并且参数不是 nameref,则它引入了一个变量间接级别。Bash 使用由参数的其余部分形成的变量的值作为变量的名称;这个变量然后被扩展,并且该值用于替换的其余部分,而不是参数本身的值。这称为间接扩展。如果 parameter 是 nameref,这将扩展为 parameter 引用的变量的名称,而不是执行完整的间接扩展。对此的例外是扩展${!prefix*}
和${!name[@]}
如下面所描述的。感叹号必须紧跟在左大括号之后才能引入间接性。
对于问题的第二部分,我可能会尽量避免在模板中使用实际的 shell 变量,而是使用易于解析的占位符并使用类似sed
.
有一些类似的问题,包括“如何用文件中的内容替换文档中的占位符字符串”、“从模板创建文本文件的工具”和“如何替换文本文件中的占位符列表? ”(还有其他人)。
使用评估
$ test1=\$test2
$ test2="string to print"
$ echo $test2
string to print
$ eval echo $test1
string to print
Run Code Online (Sandbox Code Playgroud)