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
| 归档时间: |
|
| 查看次数: |
17933 次 |
| 最近记录: |