LoginSignup
1
1

More than 5 years have passed since last update.

Bashでテンプレートエンジンっぽいものを作った

Last updated at Posted at 2016-09-07

ちょっとした自動化で使えるように、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 *.

うっかり、関数内で変数を " で囲むのを忘れると、* がシェルで展開されてエラーになるので、テストコードを付けておいた。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1