当我偶然发现envsubst
我只想用它来替换特定的变量时,我怀疑 SHELL-FORMAT 参数可能是我想要的,但我无法让它工作。
不幸的是,man
和info
页面没有提供任何使用示例,只说
如果给出了 SHELL-FORMAT,则仅替换 SHELL-FORMAT 中引用的环境变量
它并没有告诉我如何引用它们。
答案1
正如文本所示,您只需像在通常的 shell 命令中一样引用(例如通过$VARNAME
或${VARNAME}
)变量即可。但是,您必须确保 shell 不会事先扩展它们。
以下有些例子可以说明这一点(假设export FOO=BAR
):
$ echo '$FOO$FOO2' | envsubst
BAR
如您所见,$FOO2 已被替换为“”,因为它未定义。现在我们可以通过以下方式将该替换限制为仅 $FOO:
$ echo '$FOO$FOO2' | envsubst '$FOO'
BAR$FOO2
使用""
Instead of''
会导致在需要之前进行替换:
echo '$FOO$FOO2' | envsubst "$FOO"
$FOO$FOO2
(这相当于有效调用envsubst "BAR"
,它没有检测到任何变量,因此没有变量被替换。)
正如man
页面所说,所有引用的变量都SHELL-FORMAT
被替换了,所以我们甚至可以这样做:
echo '$FOO$FOO2$FOO3' | envsubst '$FOO some more text ${FOO3}'
BAR$FOO2
正如您所见,它SHELL-FORMAT
非常灵活。
最后,该参数--variables
允许您评估选择哪些变量进行替换SHELL-FORMAT
:
envsubst --variables '$FOO some more text ${FOO3}'
FOO
FOO3
在上面过早替换的例子中,这将显示错误:
$ envsubst --variables "$FOO"
(empty string returned)
正如在 -page 中所述man
,当存在envsubst
时,不会处理任何 stdinput 。--variables
答案2
以下是一些帮助我理解如何正确使用它的示例。令我惊讶的是,envsubst 仅替换参数中提到的变量。
export FOO_X="value_x"
export FOO_Y="value_y"
export FOO_Z="value_z"
$ echo 'x=$FOO_X y=$FOO_Y z=${FOO_Z}' | envsubst
x=value_x y=value_y z=value_z
$ echo 'x=$FOO_X y=$FOO_Y z=${FOO_Z}' | envsubst '$FOO_X'
x=value_x y=$FOO_Y z=${FOO_Z}
$ echo 'x=$FOO_X y=$FOO_Y z=${FOO_Z}' | envsubst '$FOO_X $FOO_Z'
x=value_x y=$FOO_Y z=value_z
$ echo 'x=${FOO_X} y=${FOO_Y} z=${FOO_Z}' | envsubst '$FOO_Z ${FOO_Y}'
x=${FOO_X} y=value_y z=value_z
$VAR
顺便说一下,两种${VAR}
方法似乎都有效。顺序无关紧要。
我也不明白SHELL-FORMAT是什么意思,至今不知道为什么会这样命名。不过经过上面的实验,我想我知道它是干什么的了。
答案3
措辞有点混乱。为了更细致地重述帮助文本:
SHELL-FORMAT
是包含对环境变量的引用的可选文本命令行参数。要在文本中引用环境变量,请在变量名称前加上前缀$
。例如:Hello $FOO World $BAR
引用环境变量FOO
和BAR
。字符串的其余部分将被忽略。如果SHELL-FORMAT
存在命令行参数,则当变量替换发生在通过 stdin 接收的文本上时,它将仅限于SHELL-FORMAT
命令行参数中引用的变量。
因此,要明确回答您的问题:在变量名前加上前缀$
。
答案4
我发现它对此特别有用...
cat myfile|envsubst '$(env|grep AJN)'
这将替换当前在我的环境 (env) 中定义的所有包含 AJN(我的姓名首字母缩写)的变量,但其余所有变量保持不变。