我有一个模板文件(template.txt
):
Hello, $x
Hello, $y
我有一个脚本文件(script.sh
):
#!/bin/bash
$x=linux
$y=unix
# I want to include template.txt as a here-doc
如何将template.txt
包括为here-doc
script.sh
因此,当我运行script.sh
时,输出应为:
Hello, linux
Hello, unix
修改
我认为replace
对我的工作很有帮助:
$ cat template.txt | replace '$x' linux '$y' unix
更复杂的工具:
$ cheetah compile template.tmpl
$ x=linux y=unix python template.py --env
答案 0 :(得分:3)
我在我的一个项目中使用此功能。它从模板构建一个实际的here文档,然后使用.
:
# usage: apply_template /path/to/template.txt
apply_template () {
(
trap 'rm -f $tempfile' EXIT
tempfile=$(mktemp $(pwd)/templateXXXXXX)
echo 'cat <<END_TEMPLATE' > $tempfile
cat $1 >> $tempfile
echo END_TEMPLATE >> $tempfile
. $tempfile
)
}
答案 1 :(得分:3)
以下bash函数将任意文件评估为此文档,允许将bash用作迷你模板语言。它不需要任何临时文件。
#!/bin/bash
template() {
file=$1
shift
eval "`printf 'local %s\n' $@`
cat <<EOF
`cat $file`
EOF"
}
变量将从环境中扩展或可以直接传递,例如用于模板文件
Hello $x, $y, $z
和摘要
y=42
for i in 1 2; do
template template.txt x=$i z=end
done
输出将是
Hello 1, 42, end
Hello 2, 42, end
请注意,模板文件中的任意代码也会被执行,因此请确保您信任编写它的人。
答案 2 :(得分:2)
#!/bin/bash
x=linux
y=unix
cat << EOF
Hello, $x
Hello, $y
EOF
答案 3 :(得分:1)
这可能适合你(GNU sed):
cat <<\! >template.txt
Hello, $x
Hello, $y
!
cat <<\! >replace
export "$@"
sed -e '1i\cat <<EOT' -e '$a\EOT' | sed ':a;$!{N;ba};e'
!
cat template.txt | replace x='Fred Flintstone' y='Barney Rubble'
Hello, Fred Flintstone
Hello, Barney Rubble
答案 4 :(得分:1)
这是我提出的解决方案:
eval $'cat <<\002\n'"$(<ifile)"$'\n\002' > ofile
\002
可以替换为ifile中不会出现的任何字符或字符串。要删除输入文件中出现的任何分隔符:
eval $'cat <<\002\n'"$(tr -d '\002' < ifile)"$'\n\002' > ofile
此解决方案似乎解决了大多数问题,但通过$(command)
指令明显容易受到模板文件中命令注入的攻击。</ p>