67

有没有办法防止envsubst替换 a $VARIABLE?例如,我希望是这样的:

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

并让它返回

dont substitute $THIS

但相反我得到

dont substitute \THAT

这样做有什么转义字符吗?

4

9 回答 9

79

如果你给出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

于 2014-07-25T20:43:57.557 回答
48
export DOLLAR='$'

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

或者更清楚:

export THIS=THAT
echo '${DOLLAR}THIS' | DOLLAR='$' envsubst
于 2014-07-25T20:36:50.180 回答
15

我的解决方法如下:

原始模板:

$change_this
$dont_change_this

编辑模板:

$change_this
§dont_change_this

现在您可以处理:

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

这取决于§模板上其他任何地方都没有出现的字符。您可以使用任何其他字符。

于 2019-03-21T07:39:20.853 回答
14
$ echo $SHELL
/bin/bash
$ echo \$SHELL
$SHELL
$ echo \$SHELL | envsubst 
/bin/bash
$ echo \$\${q}SHELL | envsubst 
$SHELL

这样做$$可以让你添加一个$字符。然后只是“替换”不存在的变量(我在这里使用${q}但可以是更有意义的东西${my_empty_variable},你最终会得到你需要的东西。

就像段落解决方案一样 - 你需要一些特别的东西 - 这里......一个不存在的变量,我更喜欢在模板上执行额外的 sed 。

于 2020-04-16T20:51:53.110 回答
8

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

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

在这里,$four变量被替换为$four,实际上保持不变。

于 2019-02-17T11:42:58.020 回答
7

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

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

于 2019-01-22T23:38:44.833 回答
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's一起使用awk

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

警告:这之间唯一的主要区别envsubst是这不会改变不存在值的变量。那{{HAS-NO-VALUE}}将保持原样,envsubst将删除那些(将它们替换为空白)。

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

于 2021-03-18T15:53:11.567 回答
0

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

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

第四个 envvar 未被替换,而在其输出中使用默认值的处理仍然存在。但这无关紧要,因为如果未设置变量并且设置了它的值,则稍后处理此行仍然不会提供任何内容。

于 2021-01-10T11:28:18.447 回答
0

我这样做的方式是

export DONT_CHANGE_THIS=\${DONT_CHANGE_THIS}
envsubst < some-template.yml > changed.yml

所以它会尝试用 ${var} 替换 ${var} 作为输出,你会得到 ${var} 打印出来

于 2022-01-05T12:58:10.590 回答