2016-09-20 88 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