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