有没有办法阻止envsubst
替换$VARIABLE
?例如,我希望有类似的东西:
export THIS=THAT
echo "dont substitute \\\$THIS" | envsubst
并让它返回
dont substitute $THIS
但我得到了
dont substitute \THAT
这样做是否有任何转义字符?
答案 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
如您所见,如果 {{
和 }}
不是您喜欢的,那么实际上每个都需要更改,并且此脚本适用于 busybox
的 awk
.
它不会是世界上最快的解决方案,但它真的很容易实现,我主要运行它来准备配置文件,所以速度无关紧要。
警告:这与 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 没有被替换,而在其输出中使用默认值的处理仍然存在。不过这并不重要,因为如果未设置变量且设置了其值,稍后处理此行仍然不会产生任何结果。