使用envsubst替换模板变量
一、概述
在许多情况下,模板、配置或初始化文件将 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
另外,让我们设置并导出两个变量FOO和BAR:
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 -
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/envsubst/8490.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.