シェルスクリプトを本気で学びたい人のための10冊

シェルスクリプトについて、プログラミング言語の一種としてガッツリ学んだうえで、しかし得手不得手を見極めて、無理せずシェルスクリプトらしい使い方にとどめて日々を過ごしたい人のための10冊を選出すると、だいたいこんな感じとなる。

前提として「他の言語でのプログラミング経験あり」「コンソール/ターミナルに多少なりとも慣れている」人が対象。

  • 『入門UNIXシェルプログラミング 改訂第2版』
  • UNIXプログラミング環境』
  • 『シェルプログラミング実用テクニック』
  • 『実践ユニケージ開発手法01 コマンド学習編』
  • 『実践ユニケージ開発手法02 シェルスクリプト学習編』
  • 『実践ユニケージ開発手法03 Web アプリケーション編』
  • Windows/Mac/UNIXすべてで20年動くプログラムはどう書くべきか』
  • プログラミング言語AWK
  • sed & awkプログラミング 改訂版』
  • sed & awkデスクトップリファレンス』

あえてサンプル集的な側面の強い本は外している。『UNIXシェルスクリプト マスターピース132』とか、古いけど『UNIXシェルスクリプト逆引き大全333の極意』とか、便利なんだけどね。

便利なんだけど、いや、便利であるがために、他のプログラミング言語経験者がシェルスクリプトについて理解を深めずにサンプル集片手にスクリプトをでっち上げて痛い目に遭い、後でシェルスクリプト固有の諸々について「落とし穴」的に語ったりまとめ資料を作ったりするのは、なんというか、気持ちは痛いほど分かるけど、でも少々非生産的ではないだろうか?

私は基本的にCプログラマで、Javaについては素人なのだけど、Javaについて深く学ぶことなく徒手空拳で突き進んでコードを書いたら地雷を踏み抜く自信がある。シェルスクリプトも同じだ。言語が違う≒在り方が違うのだから、そのあたりをしっかり学んでおかないと、自分で自分の足を打ち抜いてしまっても文句は言えない。

(まあ、最近のモダンなプログラミング言語と比較すれば、色々とアレなのは確かだけど……でもね、大抵の環境の/bin/shのもとになったBourne Shellは1977年生まれで、今年で40歳なのよ。それぐらい大昔の、まだ言語設計もシステム開発技法も未成熟だった時期に、プログラミング言語ではなく「プアな環境でも問題なく動作する、プログラマブルな対話型コマンドインタプリタプログラミング言語とは「野球とソフトボール」ぐらいの違いはあると思う〕」の一種として開発された代物だってことを理解した上で批評してほしいなあ。言語設計の研究が進んだ2017年現在のプログラミング言語の観点で批評されても、「なら後継のシェルとか、Perl以降のスクリプト言語とか、モダンなツールを使えばよいのでは?」としか言えないっす)

『入門UNIXシェルプログラミング 改訂第2版』

「言語としてのシェルスクリプト」に四つに組んで取り組むなら、「最初の1冊」としてこれなんかがオススメ。定番書ですな。

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界

/bin/shを使い、それなりに汎用性に気を配った、オーソドックスなシェルスクリプトの書き方を基礎から学ぶのに適した本だと思う。意外と長く付き合える1冊だ。

UNIXプログラミング環境』

若干の古臭ささえなければ(あと絶版じゃなかったら)真っ先に「最初の1冊」として挙げたかった本。

UNIXプログラミング環境 (海外ブックス)

UNIXプログラミング環境 (海外ブックス)

以下の3章は必見で、シェルスクリプトの書き方として非常に参考となる。21世紀の現在でもほぼそのまま通用してしまうあたりが凄いというか恐ろしいというか。

  • 第3章 シェルの利用
  • 第4章 フィルタ
  • 第5章 シェルによるプログラミング

個人的には、恥かしながら数年前に本書でこんな書き方があることを知った。

#!/bin/sh

for i; do
    echo "$i"
done

シェル関数でも使える。実際に使用する機会は少ないものの、ちょっと興味深い。

『シェルプログラミング実用テクニック』

「シェルやシェルスクリプトを使って仕事・作業をこなす」とはどういうことなのか学ぶのに最適な1冊。

シェルプログラミング実用テクニック (Software Design plus)

シェルプログラミング実用テクニック (Software Design plus)

他書でシェルスクリプトの言語的側面を学んだ後で、「じゃあシェルやシェルスクリプトで何をするべ?」となった時に読むと、非常に効果がある。

本書や『フルスクラッチから1日でCMSを作る シェルスクリプト高速開発手法入門』などは、シェルスクリプトの「無理しない範囲での可能性」を学ぶのにちょうど良い。無理な使い方をしなくとも、意外に広い可能性をもつツールであることに気がつくはずだ。

『実践ユニケージ開発手法』

Open usp Tukubaiアリアリなら、この3冊は欠かせない(ただし3冊全てとは言わない。レベルに応じて買うべし)。

コマンド学習編

実践ユニケージ開発手法01 コマンド学習編

実践ユニケージ開発手法01 コマンド学習編

ユニケージでよく使うコマンドの解説がメイン。

「よく使うコマンド」というグルーピングなので:

  • Unix環境の標準的なテキストフィルタも載っている。
  • Open usp Tukubaiには含まれていない(商用版にのみ存在する)コマンドも載っている。
  • 一方で、Open usp Tukubaiのコマンド全てが網羅されている訳ではない。

実行例が豊富なので、Open usp Tukubaiコマンドマニュアルよりも分かりやすいと思う。

あと第2章のAWKの解説は秀逸。ワンライナー(一行野郎)としてのAWKの魅力を引き出している。

シェルスクリプト学習編

実践ユニケージ開発手法02 シェルスクリプト学習編

実践ユニケージ開発手法02 シェルスクリプト学習編

「ユニケージらしさ満載のシェルスクリプトの書き方」を学ぶための本。

「制御構文の説明が後回しになっている」とか、「シェル関数の説明が存在しない」とか、ユニケージの芳醇な香りが楽しめる。うん、徹底してるよね。

Webアプリケーション編

実践ユニケージ開発手法03 Webアプリケーション編

実践ユニケージ開発手法03 Webアプリケーション編

シェルスクリプトCGIするための本。

古き良きCGI時代の手法(HTMLのフォームによるPOSTを受け取り、HTTPレスポンスで返す「HTTPヘッダ+HTML文書」のテンプレート文字列に必要なパラメータを埋め込んで出力する方法)を、ユニケージのコマンドを使ってシェルスクリプトで実現する方法について書かれている。

あとは、JavaScriptを併用しての古典的なAjaxについても扱っている。といっても、クライアントサイドのHTTP POSTをJavaScriptXMLHttpRequestから行うようにしただけで、サーバサイドはCGI(もちろん実装はシェルスクリプトで!)のままだが。

クライアントサイドもサーバサイドも、昨今のWeb開発ではほぼ確実に利用されるだろうライブラリ・フレームワークの類を一切使用しないというスパルタぶりである。というかHTTPヘッダとかサーバサイドが吐き出すHTMLとか、そういう下回りのことをある程度知った上で開発する――という想定で書かれている。

あとサーバサイドのセッション管理の話も無かった(セッション管理自体は、シェルスクリプトによるCGIでも可能。シェルスクリプトによるCGIのセッション管理 - Qiitaを参照)。

結局のところ、開発対象として「社内LAN(イントラネット)からのみアクセスされる前提の、アクセス数がそれほど多くはない、長期運用前提の業務システム」を想定しているので:

  • 社内LANだから、別途ユーザ認証/アクセス制限されてるはず→セッション管理なし。
  • 社内システムだから、コンシューマ向けWebアプリほどのアクセス数はないだろう→CGIを選択。
  • 長期運用前提で、一度土台を作ったら、後は必要に応じて都度継ぎ足す感じに「保守・機能追加」で対応→まだ決定的なライブラリ・フレームワークが無いから、使わずに頑張る。

――みたいな感じなんだろう。

Windows/Mac/UNIXすべてで20年動くプログラムはどう書くべきか』

『実践ユニケージ開発手法』とは打って変わって、「POSIXに忠実に行こう」路線の本。

……この本はこの本で、ユニケージとは違う方向で突き抜けた感があるなあ。

すべてのUNIXで20年動くプログラムはどう書くべきか デプロイ・保守に苦しむエンジニア達へ贈る[シェルスクリプトレシピ集]』の改訂版みたいなので、旧書のほうでもよい(が、本書のほうがより先鋭化している)。私はどちらも持っている。

先に挙げた『入門UNIXシェルプログラミング 改訂第2版』も、そこそこポータブルなシェルスクリプトを志向しているのだが、今となっては本書のほうが「よりモダンな」ポータブルなシェルスクリプトを書くための参考書だと思う。

プログラミング言語AWK

シェルスクリプトで使われることの多いAWKは、アレはアレで1つの言語なこともあり、なにか1冊持っておくと重宝する。

プログラミング言語AWK

プログラミング言語AWK

  • 作者: A.V.エイホ,P.J.ワインバーガー,B.W.カーニハン,足立高徳
  • 出版社/メーカー: USP研究所
  • 発売日: 2010/01/01
  • メディア: 単行本(ソフトカバー)
  • クリック: 1回
  • この商品を含むブログを見る
何度か絶版しているAWKの名著。私は新紀元社版を持っている。

AWKの本は色々あるものの、簡易なRDB(関係データベース)を作ったり、ミニ言語を実装したり、再帰下降パーサでAWKのサブセットを書いたり、深さ優先探索でmake(1)もどきをこしらえたりするトンデモ本(誤用)は本書だけだ。

本書か、あとは『AWK実践入門 (Software Design plus)』あたりがオススメ。こちらもAWKでパズルを解いたり後置記法の数式電卓を作ったりしている。AWK本はどいつもこいつもこんな調子なような気がする*1

sed & awkプログラミング 改訂版』

sed(1)はとっつきにくいツールなので、手元にドキュメントがあると助かるのだが……。

sed & awkプログラミング 改訂版 (A nutshell handbook)

sed & awkプログラミング 改訂版 (A nutshell handbook)

sed(1)についてガッツリ解説している日本語の本は、これ1冊しか知らない。

sed(1)はこれでもチューリング完全な言語だ。sやdだけでも便利だが、aやiも(例えばフィルタの出力に後からヘッダー行やフッター行を付けたい時などに)役に立つし、グループ化・ホールドスペース・フロー制御などの禁断の果実も用意されている。

まあ、sed(1)でちょっと複雑なことを実現しようとすると、途端にスクリプトの中身が呪文と化してしまうので、健康のためにも深入りは避けたほうがよいのだが――しかし禁断の果実に魅了されて木乃伊になる木乃伊取りは後を絶たない。m4(1)と同じくらいに好事家を惹きつけてやまないツールだ。

sed & awkデスクトップリファレンス』

この本は隠れた名著。『sed & awkプログラミング 改訂版』とは別に揃えておくべき本だ。

sed & awk デスクトップリファレンス

sed & awk デスクトップリファレンス

なにが良いかっていえば、「1.3 Unixプログラム別メタキャラクタサポート状況」。よくある正規表現メタキャラクタについて、ed・vi/ex・sed/grepawk/egrepそれぞれで使えるか否か一覧表になっている。

私は、どちらかといえばvimを使う派なので、vimgrep/sedawk・その他(Perl風の正規表現が使えるツール)でメタキャラクタを取り違えることがある(例:「しまった、『?』はsed(1)では使えなかった……」)。そういう時に本書を参照している。

シェルスクリプトでは正規表現を用いることも多い。正規表現自体は『詳説 正規表現 第3版』や『正規表現クックブック』などの良書があるが、伝統的なUnixテキストフィルタの正規表現方言をカバーしているのは本書か『Windows/Mac/UNIXすべてで20年動くプログラムはどう書くべきか』あたりぐらいだろう。

まとめ

陰に陽にユニケージ勢の影響を受けたリストですな。まあ、ここ数年のシェルスクリプト界隈の盛り上がりの立役者だからなあ。

*1:AWKを256倍使うための本 (Ascii 256倍)』でもパズルゲームを作っているし、『sed & awkプログラミング 改訂版 (A nutshell handbook)』もm4(1)もどきの簡易なマクロプロセッサがあるし……。