什么是envsubst中的SHELL-FORMAT?


19

当我偶然发现时,envsubst我只想用它替换特定的变量,并怀疑可能需要使用SHELL-FORMAT参数,但我无法使其正常工作。

不幸的是,maninfo页面没有给出任何用法示例,只说了

如果给出了SHELL-FORMAT,则仅替换SHELL-FORMAT中引用的那些环境变量

哪个没有告诉我如何引用它们。

Answers:


20

如文本所示,您只需要像通常的shell命令中一样引用(例如通过$VARNAME${VARNAME})变量即可。但是,您必须确保外壳不会事先扩展它们。

这里有一些示例来说明这一点(假设export FOO=BAR):

$ echo '$FOO$FOO2' | envsubst
BAR

如您所见,由于未定义$ FOO2,因此已将其替换为“”。现在我们可以通过以下方式将替换限制为仅$ FOO:

$ echo '$FOO$FOO2' | envsubst '$FOO'
BAR$FOO2

使用""代替''会导致在需要之前进行替换:

echo '$FOO$FOO2' | envsubst "$FOO"
$FOO$FOO2

(这相当于envsubst "BAR"没有检测到变量的有效调用,因此不会替换任何变量。)

正如man-page所说,所有在其中引用的变量都将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)

man-page 中所述,envsubst存在时不处理任何stdinput --variables


8

以下是一些示例,可以帮助我了解如何正确使用它。令我惊讶的是,envsubstonly替换了参数中提到的变量。

$ export FOOX="foox"
$ export FOOY="fooy"
$ export FOOZ="fooz"

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst            
x foox y fooy z fooz

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOX'
x foox y $FOOY z $FOOZ

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOX $FOOZ'
x foox y $FOOY z fooz

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOZ $FOOY'
x $FOOX y fooy z fooz

我也不明白SHELL-FORMAT是什么意思,仍然不知道为什么这样命名。但是经过以上实验,我想我知道它能做什么。


从人的帮助和信息中读取这些示例后,这对我大有帮助,只知道SHELL-FORMAT存在,但不知道如何声明它!
zw963 '18

0

文字有点混乱。要更仔细地改写帮助文本:

SHELL-FORMAT是一个可选的文本命令行参数,包含对环境变量的引用。要在文本中引用环境变量,请在变量名称前添加$。例如:Hello $FOO World $BAR引用环境变量FOOBAR。字符串的其余部分将被忽略。如果存在SHELL-FORMAT命令行参数,则在通过stdin接收的文本上发生变量替换时,它将限于SHELL-FORMAT命令行参数中引用的变量。

因此,要明确回答您的问题:在变量名前面添加$

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.