输出文件时如何替换环境变量?

and*_*bd1 9 bash environment-variables

我想以某种方式吐出一个文件(其中包含 env 变量引用)并替换实际值。这是我尝试过的,但正如您所看到的,它不起作用。有任何想法吗?

-bash-3.00$ cat vars_file 
${MY_VAR}
-bash-3.00$ export MY_VAR=MY_VALUE; cat ./vars_file | xargs echo
${MY_VAR}
Run Code Online (Sandbox Code Playgroud)

car*_*cio 11

旧线程,但这是一个反复出现的问题。这是使用 bash 的解决方案mapfile

mateus@mateus:/tmp$ cat input.txt
a = $a
b = $b
mateus@mateus:/tmp$ echo a=$a, b=$b
a=1, b=2
mateus@mateus:/tmp$ function subst() { eval echo -E "$2"; }
mateus@mateus:/tmp$ mapfile -c 1 -C subst < input.txt
a = 1
b = 2
Run Code Online (Sandbox Code Playgroud)

bash 内置mapfile函数subst在从输入文件读取的每一行上调用用户定义的函数(请参阅 -C/-c 选项)input.txt。由于该行包含未转义的文本,eval因此使用 tu 评估它并将echo转换后的文本转换为标准输出(-E 避免解释特殊字符)。

恕我直言,这比任何基于 sed/awk/perl/regex 的解决方案都要优雅得多。

另一种可能的解决方案是使用 shell 自己的替换。这看起来像是一种更“便携”的方式,而不是中继mapfile

mateus@mateus:/tmp$ EOF=EOF_$RANDOM; eval echo "\"$(cat <<$EOF
$(<input.txt)
$EOF
)\""
a = 1
b = 2
Run Code Online (Sandbox Code Playgroud)

请注意,我们使用$EOFinput.txt 内容来最小化 cat 的 here-document 冲突。

两个例子来自:https : //gist.github.com/4288846

编辑:抱歉,第一个示例没有正确处理注释和空格。我会解决这个问题并发布解决方案。 EDIT2:修复双 $RANDOM eval