用envsubst只替换特定的变量


53

我正在尝试通过进行环境变量替换envsubst,但是我只想替换特定的变量。

从文档中,我应该能够告诉我envsubst仅替换某些变量,但我无法做到这一点。

例如,如果我有一个包含以下内容的文件:

VAR_1=${VAR_1}
VAR_2=${VAR_2}

我应该如何执行envsubst以便仅替换对的引用${VAR_1}

Answers:



130

根据手册页:

envsubst [OPTION] [SHELL-FORMAT]

如果给出了SHELL-FORMAT,则仅替换SHELL-FORMAT中引用的那些环境变量;否则,将替换它们。否则,将替换标准输入中出现的所有环境变量引用。

其中SHELL格式字符串“与引用壳牌在表单变量字符串$variable${variable}[...]变量名必须单独的字母数字组成,或下划线ASCII字符,不能以数字开头和非空,否则这样的变量引用忽略了。”
因此,必须将各自的变量名称传递envsubst给shell格式的字符串(显然,必须对它们进行转义/引用,以便从字面上传递给envsubst)。例:

输入文件,例如infile

VAR1=${VAR1}
VAR2=${VAR2}
VAR3=${VAR3}

还有一些值,例如

export  VAR1="one" VAR2="two" VAR3="three"

然后跑步

envsubst '${VAR1} ${VAR3}' <infile

要么

envsubst '${VAR1},${VAR3}' <infile

要么

envsubst '${VAR1}
${VAR3}' <infile

输出

VAR1=one
VAR2=${VAR2}
VAR3=three

或者,如果您喜欢反斜杠:

envsubst \$VAR1,\$VAR2 <infile

产生

VAR1=one
VAR2=two
VAR3=${VAR3}

13
为什么这不是公认的答案?
Qsiris '18年

3
是的,这是正确的答案!
Thomas Decaux

3
如果您知道用于限制可以替换的变量的变量前缀:envsubst "$(printf '${%s} ' ${!PREFIX*})" < infile
Sam Liddicott

或者,如果您有以下列表SUBST_VARSenvsubst "$(printf '${%s} ' $SUBST_VARS)" < infile
Sam Liddicott
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.