从heredoc

时间:2016-09-20 05:37:11

标签: bash templates heredoc

如何将" 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

1 个答案:

答案 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