[改訂第4版]シェルスクリプト基本リファレンス ――#!/bin/shで、ここまでできる

本書について──第4版改訂にあたって

この記事を読むのに必要な時間:およそ 1 分

シェルスクリプトの移植性に着目し,各種シェルの文法の違いを洗い出す目的で書き始めたのが本書でした。それは各種シェルの違いについての純粋な興味でもあり,また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つのアイコンがすべて○印で表示されている文法やコマンドが最も移植性の高い重要項目となります。本書を日々のシェルスクリプト記述の参考にしていただければ幸いです。

2024年4月 山森 丈範

※1 ⁠改訂第4版]シェルスクリプト基本リファレンス』内の関連ページ ⇒p.82, p.219, p.242, p.303
※2 ⁠改訂第4版]シェルスクリプト基本リファレンス』内の関連ページ ⇒p.6, p.166

著者プロフィール

山森丈範(やまもりたけのり)

大学時代にUNIXを触って以来,仕事でもプライベートでもUNIX系OSを使用しているプログラマ。SunOSやNEWS-OSなどが動くUNIXワークステーション上の/bin/shに長く慣れ親しみ,当時職場等でログインシェルとして与えられていたcshを,ヒストリもエイリアスも補完機能もない素の/bin/shに自主的に変更して使用したほどの/bin/sh好きである。メイン環境がLinux上のbashに変わった現在でも,/bin/shとの互換性/移植性を常に気に留めながらシェルスクリプトを書いている。