Nob*_* SE 39 bash environment-variables
当我偶然发现envsubst我只想用它来替换特定变量并怀疑 SHELL-FORMAT 参数可能是我想要的但我无法让它工作时。
不幸的是,man和info页面没有给出任何使用示例,只说
如果给出了 SHELL-FORMAT,则仅替换 SHELL-FORMAT 中引用的那些环境变量
这并没有告诉我如何引用它们。
Nob*_* SE 37
如文本所示,您只需像在通常的 shell 命令中一样引用(例如,通过$VARNAME或${VARNAME})变量。但是,您必须确保外壳不会事先展开它们。
以下是一些示例来说明这一点(假设export FOO=BAR):
$ echo '$FOO$FOO2' | envsubst
BAR
Run Code Online (Sandbox Code Playgroud)
如您所见, $FOO2 已被替换为 "",因为它没有被定义。现在我们可以通过以下方式将该替换限制为仅 $FOO:
$ echo '$FOO$FOO2' | envsubst '$FOO'
BAR$FOO2
Run Code Online (Sandbox Code Playgroud)
""在''需要之前使用而不是会导致替换:
echo '$FOO$FOO2' | envsubst "$FOO"
$FOO$FOO2
Run Code Online (Sandbox Code Playgroud)
(这相当于envsubst "BAR"没有检测到变量的有效调用,因此没有被替换。)
正如man-page 所说,所有引用的变量都SHELL-FORMAT被替换,所以我们甚至可以这样做:
echo '$FOO$FOO2$FOO3' | envsubst '$FOO some more text ${FOO3}'
BAR$FOO2
Run Code Online (Sandbox Code Playgroud)
如您所见,SHELL-FORMAT它非常灵活。
最后,该参数--variables允许您评估选择哪些变量进行替换SHELL-FORMAT:
envsubst --variables '$FOO some more text ${FOO3}'
FOO
FOO3
Run Code Online (Sandbox Code Playgroud)
在上面的过早替换示例中,这将显示错误:
$ envsubst --variables "$FOO"
(empty string returned)
Run Code Online (Sandbox Code Playgroud)
如man-page中所述,envsubst当--variables存在时不处理任何 stdinput 。
ded*_*bel 15
以下是一些帮助我理解如何正确使用它的示例。令我惊讶的是 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
Run Code Online (Sandbox Code Playgroud)
$VAR${VAR}顺便说一句,两者似乎都有效。顺序无关紧要。
我也不明白 SHELL-FORMAT 是什么意思,仍然不知道为什么它会这样命名。但是经过上面的实验,我想我知道它做了什么。