シェルスクリプトマガジン

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

プログラミング上よくある課題を、極力POSIXの範囲で、かつUNIX哲学的アプローチで解決したシェルスクリプトを多数例示し、高い可搬性・可用性を実現しつつ実用的なプログラムを書く方法を紹介しています。

下記のような内容を満載しています。

環境に依存せず、長持ちするプログラムの書き方(環境依存を引き起こす落とし穴)
環境に依存しない正規表現の書き方
シェルスクリプトで処理を行うための、たくさんの小技(レシピ)
シェルスクリプトは意外に速くて機能も豊富という事実
プログラム制作で参考になるUNIX哲学

※本書は同人誌として発行されたものを、再編集してC&R研究所より出版されたものです。

目次

序章 POSIX原理主義:その本質と可能性、実践方法を理解する

第1章 どの環境でも使えるシェルスクリプトを書く …… 文法・変数編

1-1 環境変数などの初期化
1-2 シェル変数
1-3 スコープ
1-4 正規表現
1-5 文字クラス
1-6 乱数
1-7 ロケール
1-8 $(( 式 ))
1-9 case文/if 文
1-10 local修飾子
1-11 PIPESTATUS変数

第2章 どの環境でも使えるシェルスクリプトを書く …… 正規表現編

2-1 知っておくべきメタ文字セットは3つ
2-2 BRE(基本正規表現)メタ文字セット
2-3 ERE(拡張正規表現)メタ文字セット
2-4 AWKで使えるメタ文字セット

第3章 どの環境でも使えるシェルスクリプトを書く …… コマンド編

3-1 「[」コマンド
3-2 AWKコマンド
3-3 dateコマンド
3-4 duコマンド
3-5 echoコマンド
3-6 execコマンド
3-7 foldコマンド
3-8 grepコマンド
3-9 headコマンド
3-10 ifconfigコマンド
3-11 killコマンド
3-12 mktempコマンド
3-13 nlコマンド
3-14 printfコマンド
3-15 psコマンド
3-16 readlinkコマンド
3-17 sedコマンド
3-18 sortコマンド
3-19 tacコマンド/tailコマンド+ -rオプションによる逆順出力
3-20 test([)コマンド
3-21 trコマンド
3-22 trapコマンド
3-23 whichコマンド
3-24 xargsコマンド
3-25 zcatコマンド

第4章 Hors d’oeuvre:ちょっとうれしいレシピ

4-1 sedによる改行文字への置換を、キレイに書く
4-2 grepに対するfgrepのような素直なsed
4-3 mkfifoコマンドの活用
4-4 一時ファイルを作らずファイルを更新する
4-5 テキストデータの最後の行を消す
4-6 改行なしの終端テキストを扱う
4-7 IPアドレスを調べる(IPv6も)
4-8 YYYYMMDDhhmmssを年月日時分秒に簡単分離する
4-9 祝日を取得する
4-10 ブラックリスト入りした100件を1万件の名簿から除去する

第5章 POSIX原理主義テクニック

5-1 PIPESTATUSさようなら
5-2 Apacheのcombined形式ログを扱いやすくする
5-3 シェルスクリプトで時間計算を一人前にこなす
5-4 findコマンドで秒単位にタイムスタンプ比較する
5-5 CSVファイルを読み込む
5-6 JSONファイルを読み込む
5-7 XML、HTMLファイルを読み込む
5-8 全角・半角文字の相互変換
5-9 ひらがな・カタカナの相互変換
5-10 バイナリデータを扱う
5-11 ロック(排他・共有)とセマフォ
5-12 デバッグってどうやってるの?

第6章 POSIX原理主義テクニック …… Web編

6-1 URLデコードする
6-2 URLエンコードする
6-3 Base64エンコード・デコードする
6-4 CGI変数の取得(GETメソッド編)
6-5 CGI変数の取得(POSTメソッド編)
6-6 Webブラウザーからのファイルアップロード
6-7 Ajaxで画面更新したい
6-8 シェルスクリプトでメール送信
6-9 メールマガジンを送る
6-10 HTMLテーブルを簡単キレイに生成する
6-11 シェルスクリプトおばさんの手づくりCookie(読み取り編)
6-12 シェルスクリプトおばさんの手づくりCookie(書き込み編)
6-13 シェルスクリプトによるHTTPセッション管理

第7章 知らないとハマるさまざまな落とし穴

7-1 名前付きパイプからリダイレクトするときの落とし穴
7-2 全角文字に対する正規表現の扱い
7-3 sortコマンドの基本と応用と落とし穴
7-4 sedのNコマンドの動きが何かおかしい
7-5 標準入力以外からAWKに正しく文字列を渡す
7-6 AWKの連想配列が読み込むだけで変わる落とし穴
7-7 whlie readで文字列が正しく渡せない
7-8 あなたはいくつ問題点を見つけられるか?

付録 レシピを駆使した調理例

郵便番号から住所欄を満たすアレをシェルスクリプトで