Bash 执行字符串的可变扩展

Fra*_*yce 9 bash

我试图有两层间接,但如果我是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.

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

  • 如果字符串包含变量,但它本身不是变量的名称,这可能吗? (2认同)

Ipo*_*cer 6

使用评估

$ test1=\$test2
$ test2="string to print"
$ echo $test2
string to print
$ eval echo $test1
string to print
Run Code Online (Sandbox Code Playgroud)