envsubst有逃脱角色吗?

时间:2014-07-25 20:08:09

标签: bash shell envsubst

有没有办法阻止envsubst替换$VARIABLE?例如,我希望有类似的东西:

export THIS=THAT
echo "dont substitute \\\$THIS" | envsubst

并让它返回

dont substitute $THIS

但我得到了

dont substitute \THAT

这样做是否有任何转义字符?

9 个答案:

答案 0 :(得分:41)

如果您为envsubst提供变量列表,则替换这些变量,而忽略其他替换。我不确定它是如何工作的,但是类似下面的内容似乎可以做你想要的:

$ export THIS=THAT FOO=BAR
$ echo 'dont substitute $THIS but do substitute $FOO' | envsubst '$FOO'
dont substitute $THIS but do substitute BAR

请注意$THIS保持不变,$FOO替换为BAR

答案 1 :(得分:27)

export DOLLAR='$'

export THIS=THAT
echo '${DOLLAR}THIS' | envsubst

或者更清楚:

export THIS=THAT
echo '${DOLLAR}THIS' | DOLLAR='$' envsubst

答案 2 :(得分:7)

$ echo $SHELL
/bin/bash
$ echo \$SHELL
$SHELL
$ echo \$SHELL | envsubst 
/bin/bash
$ echo \$\${q}SHELL | envsubst 
$SHELL

因此,$$允许您添加$字符。然后只是“替换”不存在的变量(在这里我使用了${q},但可能更有意义,例如${my_empty_variable},您将得到所需的结果。

就像段落解决方案一样-您需要一些特殊的东西-这里...一个不存在的变量,我希望比在模板上执行其他sed多一些。

答案 3 :(得分:2)

就我而言,我只想转义尚未定义的var。为此,请运行:

envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')"

答案 4 :(得分:2)

如果您只想扩展一个或两个变量,则可以通过将它们临时设置为自己的名称来将其列入白名单,如下所示:

$ echo 'one $two three $four' | four='$four' envsubst
one  three $four

在这里,$four变量被$four取代,实际上保持不变。

答案 5 :(得分:1)

这是我使用的一种替代方法,因为它无需为一个程序安装整个 gettext 软件包。我有这个 awk 脚本,我调用 envtmpl,它会将任何看起来像 {{ENV-VAR}} 的环境变量交换为 ENV-VAR

#! /usr/bin/awk -f
{ for (a in ENVIRON) gsub("{{" _ a _ "}}",ENVIRON[a]); print }

所以

$ echo "My shell '{{SHELL}}' is cool" | envtmpl
My shell '/bin/bash' is cool

如您所见,如果 {{}} 不是您喜欢的,那么实际上每个都需要更改,并且此脚本适用于 busyboxawk .

它不会是世界上最快的解决方案,但它真的很容易实现,我主要运行它来准备配置文件,所以速度无关紧要。

警告:这与 envsubst 之间唯一的主要区别在于,这将不会改变不存在值的变量。也就是说,{{HAS-NO-VALUE}} 将完全保留原样,而 envsubst 将删除那些(用空白替换它们)。

如果需要,您可以通过在 awk 中添加更多代码来解决此问题。

答案 6 :(得分:0)

如果您对Docker使用envsubst或您不喜欢他的行为,可以尝试用我的解决方案替换文件中的env变量:https://github.com/roquie/smalte

答案 7 :(得分:0)

我的解决方法如下:

原始模板:

$change_this
$dont_change_this

编辑的模板:

$change_this
§dont_change_this

现在您可以处理:

envsubst < $template | sed -e 's/§/$/g'

这取决于字符§不会在模板的其他位置出现。您可以使用其他任何字符。

答案 8 :(得分:0)

另一种“逃避”某些环境变量替换的方法是使用默认值赋值(或任何其他变量处理),因为 envsubst 不会替换这些:

$ export two=2
$ echo 'one $two three ${four:-}' | envsubst
one 2 three ${four:-}

第四个 envvar 没有被替换,而在其输出中使用默认值的处理仍然存在。不过这并不重要,因为如果未设置变量且设置了其值,稍后处理此行仍然不会产生任何结果。