Rob*_*ser 77 scripting shell-script text-processing environment-variables
有没有一种简单的方法来替换/评估文件中的环境变量?假设我有一个config.xml包含以下内容的文件:
<property>
<name>instanceId</name>
<value>$INSTANCE_ID</value>
</property>
<property>
<name>rootPath</name>
<value>/services/$SERVICE_NAME</value>
</property>
Run Code Online (Sandbox Code Playgroud)
...等等。我想$INSTANCE_ID用INSTANCE_ID环境变量的值替换文件$SERVICE_NAME中的SERVICE_NAMEenv var的值。我不会先验地知道需要哪些环境变量(或者,如果有人向配置文件添加了新的环境变量,我不想更新脚本)。谢谢!
don*_*sti 119
您可以使用envsubst(部分gnu gettext):
envsubst < infile
Run Code Online (Sandbox Code Playgroud)
会将文件中的环境变量替换为其相应的值。变量名称必须仅由字母数字或下划线 ASCII 字符组成,不能以数字开头且非空;否则这样的变量引用将被忽略。
要仅替换某些环境变量,请参阅此问题。
hsc*_*hou 38
这不是很好,但它有效
( echo "cat <<EOF" ; cat config.xml ; echo EOF ) | sh
Run Code Online (Sandbox Code Playgroud)
如果它在 shell 脚本中,它看起来像:
#! /bin/sh
cat <<EOF
<property>
<name>instanceId</name>
<value>$INSTANCE_ID</value>
</property>
EOF
Run Code Online (Sandbox Code Playgroud)
编辑,第二个建议:
eval "echo \"$(cat config.xml)\""
Run Code Online (Sandbox Code Playgroud)
编辑,与问题不严格相关,但在从文件读取变量的情况下:
(. .env && eval "echo \"$(cat config.xml)\"")
Run Code Online (Sandbox Code Playgroud)
如果您碰巧有 Perl(但没有 gettext 和envsubst),您可以用一个简短的脚本进行简单的替换:
$ export INSTANCE_ID=foo; export SERVICE_NAME=bar;
$ perl -pe 's/\$([_A-Z]+)/$ENV{$1}/g' < config.xml
<property>
<name>instanceId</name>
<value>foo</value>
</property>
<property>
<name>rootPath</name>
<value>/services/bar</value>
</property>
Run Code Online (Sandbox Code Playgroud)
我假设变量名只有大写字母和下划线,但第一个模式应该很容易根据需要进行更改。
$ENV{...}引用 Perl 看到的环境。
如果要支持${...}语法或在未设置的变量上引发错误,则需要做更多工作。gettext's 的近似等价物envsubst是:
perl -pe 's/\$(\{)?([a-zA-Z_]\w*)(?(1)\})/$ENV{$2}/g'
Run Code Online (Sandbox Code Playgroud)
虽然我觉得通过流程环境提供这样的变量一般来说似乎有点不确定:您不能在文件中使用任意变量(因为它们可能具有特殊含义),并且某些值可能至少具有半其中的敏感数据。