シェルスクリプトでは、データはキーボードから入力するかデータファイルを読み込ませるのが通常です。しかしデータはシェルスクリプトに直接書き込むという方法もあります。

ヒアドキュメントという機能を使うことで、本来ならデータを格納したファイル名を記述する場所に、データを直接書き込んでしまうというものです。

まずは、サンプルを実行してみます。

#!/bin/sh
uniq -d <<string1
aaa
aaa
bbb
ccc
ddd
ddd
string1

実行結果

aaa
ddd

uniqは、連続する複数の同じ内容の行があれば、ひとつの行に縮めて出力するコマンドです。上記サンプルでは、uniqコマンドに対してヒアドキュメントにより、シェルスクリプト上に記述したデータを渡しています。

ヒアドキュメントの書式
コマンド >>文字列
データ
文字列

最初の文字列と最後の文字列は、ヒアドキュメントの初めと終わりの識別子となるため、完全に同じでなければなりません。同じであれば、文字列は何でも良いです。

ヒアドキュメントを使うことで、シェルスクリプト上にデータを書き込むことができるので、シェルスクリプトとデータファイルを一体化することができます。

ただ、本来、プログラムとデータファイルは分離するのが一般的です。シェルスクリプトに限らず、ソースコード上にデータを直接記述することを「ハードコーティング」などと言いますが、これは推奨されず、良くないコードの典型とされています。

その理由として、例えば、同じプログラムで別のデータを使いたくなった場合は、プログラムそのものを修正しないといけません。逆に、同じデータを別のプログラムで使いたい場合も、もう一度同じデータを記述しないといけません。

コンパイル型の言語で作成したプログラムの場合は特に、ほんの少しのプログラム修正でも、それによる影響範囲はものすごく大きくなるため、プログラムとデータを分離するという考え方は必須と言えます。

シェルスクリプトの場合は、小規模なプログラムとなることが多く、扱うデータも多くないことが多いと言えます。また、決まった目的で使用するプログラムの場合、扱うデータが決まっており、変更することがないことはわかっていれば、プログラムとデータを分離することにこだわる必要はありません。むしろ、スクリプトの可読性が高くなるメリットもあります。

要は、ヒアドキュメントを使うか、データファイルとして分離させ、リダイレクトで読み込むかは、目的にあった方法を選べば良いでしょう。