bash - 保留 bash 样式变量的简单配置文件模板处理器
问题描述
我必须在已经包含类似 bash 的语法变量的文本配置文件(yaml、xml、json)上引入一些模板。我需要保留现有的类似 bash 的变量,但要替换我的变量。列表是动态的,变量应该来自环境。类似于采用“$${MY_VAR}}”模式但忽略 $MY_VAR 的简单处理器。最好是纯 Bash 或尽可能少的工具。
模式可以是 $$(VAR) 或任何可以很容易地从 ${VAR} 和 $VAR 中分离出来的东西。关键限制 - 它适用于 docker 容器启动过程,将环境变量注入提供的服务配置模板,并以此方式构建此配置。因此,Java 甚至 Perl 处理之类的东西都不是一种选择。
有人有简单的方法吗?
我正在使用以下 bash 处理进行此类变量替换,其中原始文件没有变量。但现在我需要一些更聪明的东西。
# process input file ($1) placing output into ($2) with shell variables substitution.
process_file() {
set -e
eval "cat <<EOF
$(<$1)
EOF
" | cat > $2
}
解决方案
由于需要的软件包数量,对于 Docker 文件来说过于复杂的明显干净解决方案:
perl -p -i -e 's/\$\{\{([^}]+)\}\}/defined $ENV{$1} ? $ENV{$1} : $&/eg' < test.json
这过滤掉了 ${{VAR}},甚至更好 - 只设置了。
推荐阅读
- sql - count(distinct request_ip) 按日期分组
- r - 如何按递增和递减数字的顺序计算运行次数?
- mysql - MySql - 在while循环中插入表
- node.js - 使用 JWT 在 Node.js 中重置密码问题
- docker - 未找到版本“GLIBC_2.29”
- java - 对象究竟是如何从堆中移除的?
- next.js - 我添加到 Vercel 环境变量的秘密在我检查页面时显示
- oracle - ORACLE LISTAGG 值
- amazon-web-services - 如何在 AWS API 网关映射模板中创建字符串化 json
- python - python-can J1939过滤掩码