シェルスクリプトの移植性に着目し、各種シェルの文法の違いを洗い出す目的で書き始めたのが本書でした。それは各種シェルの違いについての純粋な興味でもあり、またLinuxなどのbashで動作するシェルスクリプトがFreeBSDのshやSolarisのshでは動かない場合の解決策のヒントを与えるためでもありました。
たとえば、シェル変数iの値に3を加算してその値をシェル変数jに代入するといった例では、bashなら((j = i + 3))
と記述できますが、FreeBSDのshではj=$((i + 3))
のような記述にする必要があり、さらにSolarisのshではj=`expr $i + 3`
という外部コマンドを利用した原始的な記述を用いる必要があります※1。
もっとも、現在ではWindowsやmacOSも含めてbashが普通に動く環境が増え、シェルスクリプトはbashで動きさえすれば良く、シェルスクリプトの移植性を考える必要性は薄れてきたとも考えられます。
しかし、このような状況の中でもなお移植性を意識することが有意義であると筆者は考えています。bashにはたくさんの便利な文法や組み込みコマンドが存在しますが、これらをすべて同列に考えるのではなく、これらが従来のshでもずっと使われてきた文法やコマンドなのか、比較的最近にbashで追加されたものなのかを知った上で使うようにした方が、シェルスクリプトに対する理解がより深まると信じるからです。
本書は、Linux(bash)、FreeBSD(sh)、Solaris(sh)の動作対応状況をアイコン表示することを特徴の一つとしてきましたが、第3版ではBusyBox(sh)を追加し、この第4版ではDebian(dash)とzshを追加しました。dashはFreeBSD(sh)と由来が同じであるため動作は似ていますが、詳しく調べてみると細かい動作が異なります。zshは一見bashと同じように動作するように見えますが、シェル変数をダブルクォートを付けずに展開しても、つまり変数varを"$var"
ではなく$var
として展開しても単語分割やパス名展開が行われないという大きな非互換性があるため、その違いはしっかりと認識しておく必要があるでしょう※2。
本書で取り上げている6種類のシェルの6つのアイコンがすべて○印で表示されている文法やコマンドが最も移植性の高い重要項目となります。本書を日々のシェルスクリプト記述の参考にしていただければ幸いです。