首页 > 解决方案 > 保留 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
}

标签: bashshelltext-processingvariable-substitution

解决方案


由于需要的软件包数量,对于 Docker 文件来说过于复杂的明显干净解决方案:

perl -p -i -e 's/\$\{\{([^}]+)\}\}/defined $ENV{$1} ? $ENV{$1} : $&/eg' < test.json

这过滤掉了 ${{VAR}},甚至更好 - 只设置了。


推荐阅读