Bash 替换文件中的环境变量

Bash 替换文件中的环境变量,bash,shell,environment-variables,zsh,Bash,Shell,Environment Variables,Zsh,我有一个myfile,其中包含如下行 #!/usr/bin/env python3 print("Hello world") names = ('${(j:', ':)ZSH_VAR[@]}', ) 我想在我加载的shell中使用环境变量预处理这个文件(zsh,在我的例子中,但是通用的bash解决方案也可以很好地工作) 我怎样才能做到这一点 $ declare -ga ZSH_VAR=( 1 2 3 ) $ preprocess < myfile 为此,您可以使用e

我有一个
myfile
,其中包含如下行

#!/usr/bin/env python3
print("Hello world")
names = ('${(j:', ':)ZSH_VAR[@]}', )
我想在我加载的shell中使用环境变量预处理这个文件(
zsh
,在我的例子中,但是通用的
bash
解决方案也可以很好地工作)

我怎样才能做到这一点

$ declare -ga ZSH_VAR=( 1 2 3 )
$ preprocess < myfile

为此,您可以使用
eval

$ BAR=1234 FOO=abcd; while read -r line; do eval 'echo "'"$line"'"'; done < "file"
注意


小心点。确保您的文件不包含
rm
命令。只是为了安全。

我不确定我是否理解正确,但您是否在寻找?
eval'bar=“$bar”
declare'bar=“$bar”
?请查看Wooledge wiki上的页面。不过,只有在您信任数据的情况下才可以使用。使用
envsubt
更安全;文件中的
$(rm-rf~)
不可能破坏您的主目录。如果要使用
eval
,最好使用
eval'echo'“$line”'”
,这样您就不会有一行包含
*HELLO*
的文件名列表替换
*
,或者将制表符改为空格,或者删除前导制表符,等等。也就是说,正如目前所写的,这个答案有很多意外/不希望出现的行为。请参见……中的上述问题演示,将上面的输出与……中演示的较少中断(但仍然不安全)的方法进行比较(请注意显示固定版本的链接中
read
之前的
IFS=
,该链接在
read
进入
行之前就停止删除前导和尾随空格
了!)
$ BAR=1234 FOO=abcd; while read -r line; do eval 'echo "'"$line"'"'; done < "file"
#!/bin/bash

while read -r line; do eval 'echo "'"$line"'"'"; done < "file"

# If you want to redirect the output into a file (out.txt).
# while read -r line; do eval 'echo "'"$line"'" >> out.txt'; done < "file"
# Or  this
# while read -r line; do eval 'echo "'"$line"'"'; done < "file" > out.txt
FOO=abcd BAR=1234 ./script.sh