具体代码
###############################
#
# Funciton: micro_template_compile
#
# Parameter:
# [1] => template :String
# [2..n] => values for placeholder as key=value
#
# Example:
# <- micro_template_compile '{code: {{error.code}}, message: "{{error.message}}"}' "error.code=127" "error.message=command not found."
# ---
# -> { code: 0, message: "" }
###############################
function micro_template_compile() {
template_string="$1"; shift;
expression=""
while [ $# -ne 0 ]; do
key=$(echo "$1" | sed 's~^\([^=]*\)=\(.*\)$~\1~g')
value=$(echo "$1" | sed 's~^\([^=]*\)=\(.*\)$~\2~g')
expression="s~{{$key}}~$value~g;$expression"
shift;
done
echo "$template_string" | sed "$expression"
}
使用案例
执行
micro_template_compile 'Hi {{name}}, it is {{date}} today and {{weather}} outside. :)
message to you: {{message}}' \
name='小王' date="$(date +"%Y/%m/%d")" weather="大晴天儿" message="咱们出去钓鱼吧!"
输出
Hi 小王, it is 2014/06/16 today and 大晴天儿 outside. :)
message to you: 咱们出去钓鱼吧!
使用到脚本中:
#!/bin/bash
#
# Usage: $exename [options] -in templatefile key=value ...
#
# Examples:
# $exename -in ./1.txt.template -out ./1.txt f1=v1 f2=v2 f3=v3
# $exename -help
#
###############################
#
# Funciton: micro_template_compile
#
# Parameter:
# [1] => template :String
# [2..n] => values for placeholder as key=value
#
# Example:
# <- micro_template_compile '{code: {{error.code}}, message: "{{error.message}}"}' "error.code=127" "error.message=command not found."
# ---
# -> { code: 0, message: "" }
###############################
function micro_template_compile() {
local template_string="$1"; shift;
local expression=""
local key=""
local value=""
while [ $# -ne 0 ]; do
key=$(echo "$1" | sed 's~^\([^=]*\)=\(.*\)$~\1~g')
value=$(echo "$1" | sed 's~^\([^=]*\)=\(.*\)$~\2~g')
expression="s~{{$key}}~$value~g;$expression"
shift;
done
echo "$template_string" | sed "$expression"
}
main() {
template="$(cat "$arg_in")"
eval "micro_template_compile '$template' $arg_datagroup > '$arg_out'"
return 0
}
processargs() {
# defaults:
arg_in=""
arg_out="stdout"
arg_datagroup=""
# arguments:
while echo "$1" | grep "^-" >/dev/null 2>&1; do
case "$1" in
-in)
arg_in="$2"; shift;
;;
-out)
arg_out="$2"; shift;
;;
esac
shift
done
while [ $# -ne 0 ]; do
arg_datagroup="$arg_datagroup \"$1\""; shift;
done
# exports
export arg_in arg_out arg_datagroup
}
processargs "$@"
echo ""
echo "arg_in=|$arg_in|"
echo "arg_out=|$arg_out|"
echo "arg_datagroup=|$arg_datagroup|"
echo ""
main