此问题在此处已有答案:
How to expand shell variables in a text file?(共10个答案)
昨天关门了。
这是我所遇到的问题的简化版本,只是为了演示的目的。但是当命令输出包含变量引用时,它似乎没有经过评估过程来填充它所包含的变量引用。
因此,请演示我创建了一个txt文件(/mnt/external.txt),其中包含以下文本行“${var 1}/filename.txt”。然后,我将执行如下所示的bash脚本:
#!/bin/bash
var1="/home/user1"
echo $(cat /mnt/external.txt)
然后输出“${var 1}/文件名.txt”,而不是“/home/user1/filename.txt”。
有没有办法让它重新计算cat命令的输出(刚才用cat演示了这个问题),让它用变量值填充变量引用?
4条答案
按热度按时间lbsnaicq1#
您可以为命令的所有输出调用
envsubst
,这是您在注解中提到的内容,而不是您的问题。并且输出被
olmpazwi2#
您需要通过eval传递返回的字符串,以使替换生效。您的代码片段应修改如下:
apeeds0o3#
这打印你想要的,但我同意戈登,这是不安全的。
llycmphe4#
您可以使用heredoc来展开变量和命令替换:
这里
eval
只用于打印文件external.txt
,因此heredoc可以展开它。这比
eval "echo '$(<external.txt)'"
更安全、更可预测(即使使用引号),但如果external.txt
包含像$(rm important.txt)
这样的命令sub或heredoc分隔符,仍然会出现代码注入:不同之处在于,它比eval + echo的可预测性稍强,因为在eval + echo中,偏离的引号和/或列表运算符(
;
|
&
等)可能导致代码执行。