假设我已经声明了以下变量:
$ var='$test'
$ test="my string"
如果我打印他们的内容,我会看到以下内容:
$ echo $var
$test
$ echo $test
my string
我想找到一种方法来打印内容的内容$var
(即 的内容$test
)。所以我尝试执行以下操作:
$ echo $(echo $var)
$test
但是这里的结果是$test
而不是"my string"
......是否可以使用bash打印变量内容的内容?
您可以使用 bash 的间接变量扩展来完成此操作(只要您可以
$
从参考变量中省略 ):3.5.3 Shell参数扩展
对于包含在其中的变量名称
var
以您为前缀的情况,$
可以使用eval
:这里会发生什么:
$var
为 value$test
,产生一个eval echo $test
命令;eval
计算echo $test
表达式并产生所需的结果。请注意,
eval
通常使用可能是危险的(取决于存储在 中的内容var
),因此最好避免使用它。间接扩展功能更适合您的情况(但您需要摆脱$
登录$test
)。类似于Jesse_b's answer,但使用名称引用变量而不是变量间接(需要
bash
4.3+):名称引用变量
var
保存它所引用的变量的名称。当变量被取消引用为$var
时,将返回其他变量的值。bash
递归解析名称引用:为了完整起见,使用关联数组(在
bash
4.0+ 中)也是解决此问题的一种方法,具体取决于要求:这提供了一种通过可以动态确定的键或名称访问多个值的更灵活的方式。如果您想在单个数组中收集特定类别的所有值,但仍然能够通过某些键(例如,可通过 ID 访问的名称,或可通过目的访问的路径名等)访问它们,这可能会更可取,因为它不会造成污染脚本的变量命名空间。
与
zsh
:使用任何类似 Bourne 的外壳
请记住,在这些 shell 中,必须引用变量扩展以防止 split+glob (
zsh
作为一个例外)并且echo
不能用于任意数据。由于两者
(e)
都有eval
shell 代码评估,重要的是$var
保持在您的控制范围内,否则可能是任意命令注入漏洞(与${!var}
方法相同)。