如何将template.txt包含为脚本的here-doc

时间:2012-04-01 01:43:26

标签: bash

我有一个模板文件(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

5 个答案:

答案 0 :(得分:3)

我在我的一个项目中使用此功能。它从模板构建一个实际的here文档,然后使用.

在当前shell中执行它
# 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>