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 是什么意思,仍然不知道为什么它会这样命名。但是经过上面的实验,我想我知道它做了什么。
归档时间: |
|
查看次数: |
21112 次 |
最近记录: |