シェル(bash,zsh)の機能を使って置き換える

 ファイルの内容を置き換える方法にはシェルの機能を使う方法もあります。これは、シェルで使える変数に置き換える内容を入れておきます。後はシェルの置換機能を利用するだけという、割とシンプルな方法です。この時、ポイントになるのは内容を置き換えるファイルに置き換えるための特殊記号を書いておくという事です。

文章で書くと分かりにくいかもしれませんので、まず簡単なサンプルでやってみましょう。コマンドを入力して実際にやって方が納得できる人もいるでしょう。

まず、シェルは変数を使うことができますが、あらかじめ定義されている変数および環境変数は使用しないようにします。

変数に何か入っているかはechoを使うと確認できます。ここでは変数Aの内容を表示しています。最初の時点では何も変数Aには何も入っていません。

echo ${A}

変数に何か入っている場合は以下のようになります。ここでは変数Aに数値を入れてから内容を表示しています。

A=123
echo ${A}

bashにはあらかじめ以下の環境変数が定義されています。この環境変数は自分で使う変数には使用しないようにしましょう。
bash,zshではprintenvとすると定義されている環境変数が表示されます。また特定の変数名だけをチェックしたい場合はprintenv 変数名のようにprintenvの後に変数名を指定します。

ここでは内容を置き換える変数名をINFOとします。これを置き換える文章内に埋め込みます。が、このまま文章内に埋め込んだだけでは駄目です。文章に埋め込む時に以下のような記号と組み合わせて記述します。

${変数名}

こうする事で内容が変数に書かれた内容に置き換わります。 先ほどのサンプルに組み込むと以下のようになります。

 ようこそ喫茶マイナビへ。さまざまなレトロUNIXマシンを用意して、お待ちしております。

${INFO}

 Tel:00-0000-0000
 url:myna-bee.shop

ファイルは準備できましたので、次に変数に置き換える内容をセットします。先ほども使いましたがbash,zshともコマンドラインから以下のように=を使い内容を変数に入れます。

変数名=内容

今回は変数名はINFOなので以下のように入力します。

INFO='営業中'

実際に変数に文字が入ったかどうかはechoコマンドで確認できます。 INFOの変数内容を確認するには以下のようにします。

echo $INFO

これで準備できたので、さっそくやってみましょう。ただし、単純にcatコマンドで以下のように入力しても変数部分の文字は置き換わらずに、そのまま表示されてしまいます。

cat infotemp.txt

ファイルに書かれた変数内容を置換する方法はいくつかありますが、evalを使う場合は以下のようになります。

eval "echo \"$(cat infotemp.txt)\""

今度は期待通りにファイルの内容が変数の内容に置き換わりました。確認のために変数INFOに準備中の文字を入れて実行してみましょう。

INFO='準備中' eval "echo \"$(cat infotemp.txt)\""

期待通りの結果です。後は、出力された結果をinfo.txtファイルにリダイレクトして保存すればできあがりです。変数INFOの内容を変更するだけで色々対応する事ができます。

INFO='休業中' eval "echo \"$(cat infotemp.txt)\"" > info.txt

変数に置き換える内容を入れておき処理する方法は悪くはありませんが、実際には使い勝手がイマイチです。というのも、変数名を忘れる、そもそも置き換える変数名がわからないなど、トラブルの要因が思いつきます。また、変数内容が有効になっているのは実行されている・操作しているシェル上でのみです。新たにシェルを起動した場合などは変数内容は引き継がれません。シェルを終了してしまえば変数の内容も消えます。