如何将" heredoc"?
的模板部分外部化我有一个使用" heredoc"的bash脚本将数据写入文件:
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
。
答案 0 :(得分:1)
你不需要cat
(杀死猫!)而且你也不需要here-doc。很遗憾,您确实需要eval
:
foo=bar
read -r template < template.properties
eval data="\"$template\""
echo $data
eval
通常被称为&#34; evil&#34;因为它可能带来安全风险。可以插入和执行任何恶意命令或错误。通常最好避免嵌入这样的代码。
为什么不编写模板而只是source
呢?例如,制作模板:
data=$foo
和你的代码:
foo=bar
source template.properties
echo $data