有没有办法防止envsubst
替换 a $VARIABLE
?例如,我希望是这样的:
export THIS=THAT
echo "dont substitute \\\$THIS" | envsubst
并让它返回
dont substitute $THIS
但相反我得到
dont substitute \THAT
这样做有什么转义字符吗?
如果你给出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
。
export DOLLAR='$'
export THIS=THAT
echo '${DOLLAR}THIS' | envsubst
或者更清楚:
export THIS=THAT
echo '${DOLLAR}THIS' | DOLLAR='$' envsubst
我的解决方法如下:
原始模板:
$change_this
$dont_change_this
编辑模板:
$change_this
§dont_change_this
现在您可以处理:
envsubst < $template | sed -e 's/§/$/g'
这取决于§
模板上其他任何地方都没有出现的字符。您可以使用任何其他字符。
$ echo $SHELL
/bin/bash
$ echo \$SHELL
$SHELL
$ echo \$SHELL | envsubst
/bin/bash
$ echo \$\${q}SHELL | envsubst
$SHELL
这样做$$
可以让你添加一个$
字符。然后只是“替换”不存在的变量(我在这里使用${q}
但可以是更有意义的东西${my_empty_variable}
,你最终会得到你需要的东西。
就像段落解决方案一样 - 你需要一些特别的东西 - 这里......一个不存在的变量,我更喜欢在模板上执行额外的 sed 。
如果只有一两个变量您不想扩展,您可以通过暂时将它们设置为自己的名称来将它们列入白名单,如下所示:
$ echo 'one $two three $four' | four='$four' envsubst
one three $four
在这里,$four
变量被替换为$four
,实际上保持不变。
就我而言,我只想转义尚未定义的变量。为此运行:
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')"
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
's一起使用awk
。
它不会是世界上最快的解决方案,但它很容易实现,我主要运行它来准备配置文件,所以速度是无关紧要的。
警告:这之间唯一的主要区别envsubst
是这不会改变不存在值的变量。那{{HAS-NO-VALUE}}
将保持原样,envsubst
将删除那些(将它们替换为空白)。
如果需要,您可以通过在 中添加更多代码来解决此问题awk
。
“逃避”某些环境变量替换的另一种方法是使用默认值赋值(或任何其他变量处理),因为 envsubst 不会替换这些:
$ export two=2
$ echo 'one $two three ${four:-}' | envsubst
one 2 three ${four:-}
第四个 envvar 未被替换,而在其输出中使用默认值的处理仍然存在。但这无关紧要,因为如果未设置变量并且设置了它的值,则稍后处理此行仍然不会提供任何内容。
我这样做的方式是
export DONT_CHANGE_THIS=\${DONT_CHANGE_THIS}
envsubst < some-template.yml > changed.yml
所以它会尝试用 ${var} 替换 ${var} 作为输出,你会得到 ${var} 打印出来