ちょっとした自動化で使えるように、Bashでrender_template
したい。
util::render_template template.txt 'name=bashist&wheather=good'
みたいに使う。
できたもの
# Render a template file
#
# $ cat template.txt
# ==========================
# Hello, I'm {{ name }}.
# It's {{ wheather }} wheather today.
# ==========================
#
# $ util::render_template template.txt 'name=bashist&wheather=good'
# ==========================
# Hello, I'm bashist.
# It's good wheather today.
# ==========================
util::render_template() {
template_text="`cat $1`"
saveIFS=$IFS
IFS='=&'
parm=($2)
IFS=$saveIFS
declare -A params
for ((i=0; i<${#parm[@]}; i+=2)); do
template_text=`echo "$template_text" | sed "s/{{ ${parm[i]} }}/${parm[i+1]}/"`
done
echo "$template_text"
}
テストコードはこちら。Bats便利ですね。
tree
|-- lib
| `-- util.sh
`-- test
|-- fixtures
| |-- test_include_asterisk.tpl.txt
| `-- test.tpl.txt
`-- test_util.bats
test/util_test.bats
#!/usr/bin/env bats
source './lib/util.sh'
@test "util::render_template with newline" {
expected="Hello, I'm bashist.
It's good wheather today."
actual="`util::render_template './test/fixtures/test_include_newline.txt' 'name=bashist&wheather=good'`"
[ "$expected" == "$actual" ]
}
@test "util::render_template with asterisk" {
expected="Hello, bashist! Asterisk is *."
actual="`util::render_template './test/fixtures/test_include_asterisk.txt' 'name=bashist'`"
[ "$expected" == "$actual" ]
}
test/fixtures/test_include_newline.txt
Hello, I'm {{ name }}.
It's {{ wheather }} wheather today.
test/fixtures/test_include_asterisk.txt
Hello, {{ name }}! Asterisk is *.
うっかり、関数内で変数を "
で囲むのを忘れると、*
がシェルで展開されてエラーになるので、テストコードを付けておいた。
参考