【bash】ファイルの変数を展開して出力する方法
皆さんはテンプレートエンジンを使っていますでしょうか。 テンプレートエンジンとは、データとテンプレートを合体させて文字列を作る仕組みのことです。
ちなみに、使用頻度の高い言語が Python なので、Jinja2 というテンプレートエンジンをよく使っています。
Jinja — Jinja Documentation (3.0.x)
しかし、このテンプレートエンジンを使うには、環境構築などの準備をする必要があります。 もう少し手軽に使えるテンプレートエンジンがあればと思ってました。
そこで、Bash を使ってテンプレートエンジンのように変数を展開する方法を記載します。
はじめに
変数が書かれている hello.txt ファイルを用意します。
Hello, ${name}
eval コマンド
LInux であれば標準で使用できる eval コマンドを使用することで、変数を展開できます。
$ name=eval
$ eval "echo \"$(cat hello.txt)\""
Hello, eval
ヒアストリングを使って展開することも可能です。
$ name=eval
$ eval "cat <<< \"$(cat hello.txt)\""
Hello, eval
envsubst コマンド
envsubst コマンドに変数を渡して実行することで、eval コマンドよりもシンプルに変数展開できます。
通常はインストールされていないので、パッケージマネージャーより gettext パッケージをインストールする必要があります。1
brew install gettext
インストールが完了したら、以下のように実行します。
$ cat hello.txt | name=envsubst envsubst
Hello, envsubst
Reference(参考文献)
- テンプレートエンジンのススメ | 前編 テンプレートエンジンとは | CodeGrid
- ファイルにかかれた変数をBashで展開し、Templateのように扱う - grep Tips *
- envsubstを使ってテキストファイルをテンプレートエンジンとして使う | ゲンゾウ用ポストイット
Footnotes
-
Mac は Homebrew からインストールできます。Linux の場合は、yum(dnf), apt からインストールしましょう。 ↩