一、概述

在许多情况下,模板、配置或初始化文件将 bash 变量的名称保留为占位符。因此,我们需要在实际使用之前填写变量的值。我们将学习如何使用envsubst命令来做到这一点。

envsubst命令在输入中搜索模式*$VARIABLE${VARIABLE}*。然后,它将模式替换为相应的 bash 变量的值。 相反,不引用任何变量的模式将替换为空字符串。

此外,envsubst只识别导出的变量该命令是 GNU“gettext”包的一部分。它的基本语法是:

1envsubst [OPTION] [SHELL-FORMAT]

3. 使用示例

让我们在文件welcome.txt中准备一个简单的问候语模板。我们将使用名称来称呼用户,添加桌面会话的名称,并以特定的问候语结束:

1Hello user $USER in $WSL_DISTRO_NAME. It's time to say $HELLO!

让我们导出HELLO变量:

1$ export HELLO="good morning"
2$ envsubst < welcome.txt
3Hello user joe in Ubuntu-22.04. It's time to say good morning!

现在,让我们取消设置这个变量:

1$ unset HELLO
2$ envsubst < welcome.txt
3Hello user joe in Ubuntu-22.04. It's time to say !

4. 使用SHELL-FORMAT指定变量

SHELL-FORMAT参数选择用于替换的变量。

也就是说,只会替换此参数中提到的变量。所有其他变量和所有其他包含美元符号的词保持不变。 变量模式与命令输入 – $VARIABLE_或*${VARIABLE}相同。 让我们检查一下shell_format_test.txt*输入文件:

1This is $FOO and this $BAR

另外,让我们设置并导出两个变量FOOBAR

1$ export FOO=foo export BAR=bar

现在,我们将只替换FOO

1$ envsubst '$FOO' < shell_format_test.txt
2This is foo and this $BAR

我们应该在SHELL-FORMAT 的内容周围使用撇号**,以防止在调用envsubst**之前进行变量替换。

5. SHELL-FORMAT的格式

请注意, SHELL-FORMAT的结构非常灵活。例如,变量可以形成一个分隔列表:

1$ envsubst '$FOO,$BAR' < shell_format_test.txt
2This is foo and this bar

或者,它们可以是任何文本的一部分:

1$ envsubst 'Please deal with $FOO and $BAR'< shell_format_test.txt
2This is foo and this bar

变量模式必须仅包含字母数字 ASCII 字符和下划线,并且不能以数字开头。

6. 替换所有环境变量

例如,让我们替换welcome.txt模板文件中的所有环境变量:

1$ envsubst "$(printf '${%s} ' $(env | cut -d'=' -f1))" < welcome.txt
2Hello user joe in Ubuntu-22.04. It's time to say $HELLO!

现在,让我们分析一下SHELL-FORMAT参数。首先,env命令提供了一个变量列表及其成对的值。然后,我们切割每一对并提取变量的名称。最后,printf将此名称放入花括号中并添加一个前导美元符号。

7. 列出SHELL-FORMAT的内容

让我们使用-v或–variables开关来打印SHELL-FORMAT参数中存在的所有变量。使用此选项,不会发生实际替换。因此,让我们以一种相当奇特的方式打印所有环境变量的名称(在xargs和column的帮助下):

1$ envsubst "$(printf '${%s} ' $(env | cut -d'=' -f1))" --variables | xargs -L4 | column -t
2XDG_VTNR               LC_PAPER                  LC_ADDRESS           XDG_SESSION_ID
3XDG_GREETER_DATA_DIR   SELINUX_INIT              LC_MONETARY          SAL_USE_VCLPLUGIN
4CLUTTER_IM_MODULE      SESSION                   GPG_AGENT_INFO       TERM
5...

8. 结论

最后,我们展示了如何使用envsubst将文本文件中所有引用的环境变量替换为它们在 shell 环境中的相应值。比如我们就可以使用该指令把 Kubernetes 的模板生成相应的应用或服务并给kubectl指令调用。

1# replace environment variables and write to new file
2envsubst < config.txt > confidential_config.txt
3
4# pipe into less
5envsubst < config.txt | less
6
7# pipe a deployment "deploy.yml" into kubectl apply
8envsubst < deploy.yml | kubectl apply -f -