从 heredoc 外部化模板

Externalize template from heredoc

如何外部化 "heredoc" 的模板部分?

我有一个 bash 脚本,它使用 "heredoc" 将数据写入文件:

foo=bar

data=$(cat <<EOF
foo: $foo
EOF
)

echo $data

执行此脚本时,我看到了预期的 foo: bar

现在,我想从脚本中提取模板部分,以支持使用不同模板文件的多种输出格式。例如,一个 template.properties 文件仅包含:

foo: $foo

为此我修改了脚本:

foo=bar

template=$(cat template.properties)

data=$(cat <<EOF
$template
EOF
)

echo $data

我遇到的问题是 $foo 变量永远不会被评估,即上面的代码打印出 foo: $foo 而不是所需的 foo: bar.

您不需要 cat(杀了猫!),您也不需要 here-doc。很遗憾,您确实需要 eval:

foo=bar

read -r template < template.properties

eval data="\"$template\""

echo $data

eval 通常被称为 "evil",因为它可能带来安全风险。可以插入和执行任何恶意命令或错误。通常最好避免嵌入这样的代码。

为什么不写模板让你干脆source呢?例如制作模板:

data=$foo

和您的代码:

foo=bar

source template.properties
echo $data