envsubst 中的 SHELL-FORMAT 是什么?

envsubst 中的 SHELL-FORMAT 是什么?

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

不幸的是,maninfo页面没有提供任何使用示例,只说

如果给出了 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引用环境变量FOOBAR。字符串的其余部分将被忽略。如果SHELL-FORMAT存在命令行参数,则当变量替换发生在通过 stdin 接收的文本上时,它将仅限于SHELL-FORMAT命令行参数中引用的变量。

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

答案4

我发现它对此特别有用...

    cat myfile|envsubst '$(env|grep AJN)'

这将替换当前在我的环境 (env) 中定义的所有包含 AJN(我的姓名首字母缩写)的变量,但其余所有变量保持不变。

相关内容