2016-09-20 51 views
0

如何外部化“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

您需要template.properties'的'内容评估,对于工作。 – andlrc

回答

1

你不需要cat(杀死猫!),你也不需要here-doc。不幸的是,你确实需要eval

foo=bar 

read -r template < template.properties 

eval data="\"$template\"" 

echo $data 

eval通常被称为“邪恶的”,因为它会带来安全风险。任何恶意命令或错误都可以插入并执行。通常最好避免像这样嵌入代码。

为什么不写模板所以你只是source呢?例如,使模板:

data=$foo 

和你的代码:

foo=bar 

source template.properties 
echo $data 
+0

谢谢。采购模板是一个好主意,但我也需要支持其他数据格式,例如JSON,例如'{“foo”:“$ foo”}'。 – matsev

+0

你可能更喜欢使用类似'python'的东西,它与JSON模块捆绑在一起,并支持许多其他数据格式。 – cdarke