テンプレートエンジン
簡易テンプレートエンジン
何一つインストールしたくなくて、sh コマンドとcatコマンドだけが動く、そんな環境で使う。
コマンドライン引数で指定されたファイル群をヒアドキュメントとして解釈させる。
シェルスクリプトのヒアドキュメントとして展開できるものがすべて通用する。
変数展開($変数名、または${変数名})
コマンド展開($(コマンド)、または\`コマンド\``)
ヒアドキュメントのため、制御機能は持たない。(条件判断、繰り返しなどは行わない。)
テンプレート側では、ヒアドキュメントで展開対象となる以下の文字群はあらかじめ \(バックスラッシュ)でエスケープしておく。
$ (U+)
\` (U+)
\ (U+)
たった4行のシェルスクリプトである。(なお、コマンドがネストするのでパフォーマンスはよくない。)
code:render_template.sh
#!/bin/sh
sh <<__99550784-c998-11ea-a11a-00155d0f6e77__
cat <<__26d35ad4-c999-11ea-bc4c-00155d0f6e77__
cat "$@"
ヒアドキュメントの終端としては、衝突しないような文字列を入れればよい。UUIDあたりでよい。
究極の安全性のためには毎回ランダム文字列を発行するのが望ましい。(さすがにそこまでやらなくてもいいと思うが)
ファイル終端がヒアドキュメントの終端として扱われるので、終端は書かなくてよい。(ここがミソ)
仕組み
最初の sh に対するヒアドキュメントとして以下が解釈される。
code:eval1.sh
cat <<__26d35ad4-c999-11ea-bc4c-00155d0f6e77__
cat "$@"
次に cat に対するヒアドキュメントとして、以下が解釈される。
code:eval2.sh
cat "$@"
これは引数で指定されたファイルをすべてその場に文字列として出力する。
4行目の cat はわかるが、どうして3行目の cat が必要なのか?
4行目の cat だけだと cat "$@" のコマンド展開のみで終ってしまって引数のファイルの文字列しか出てこない。
つまり2回ヒアドキュメントを解釈させるところがミソ。
参考
簡易テンプレートエンジン extcat coneta #1 https://qiita.com/EjiriAkira/items/30bfb2520744094a3679
Shellでファイルテンプレート的な機能を実現 https://qiita.com/jerrywdlee/items/e99c519ae2af96d89985
低機能でポータブルなテンプレートエンジンが欲しい→そこでenvsubstですよhttps://qiita.com/hnw/items/3d8bad7852510c3a84d7