新・日々録 by TRASH BOX@Eel このページをアンテナに追加 RSSフィード

2017-01-29

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

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

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

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

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

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

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

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

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

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

UNIXプログラミング環境』

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

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

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

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

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

#!/bin/sh

for i; do
    echo "$i"
done

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

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

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

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

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

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

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

コマンド学習編

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

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

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

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

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

シェルスクリプト学習編

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

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

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

何度か絶版しているAWKの名著。私は新紀元社版を持っている。

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

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

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

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

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

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

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

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)もどきの簡易なマクロプロセッサがあるし……。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/eel3/20170129/1485688745