「すべてのUNIXで20年動くプログラムはどう書くべきか」目次 まえがき 序章 POSIX原理主義 ― その本質と可能性、実践方法を理解する デプロイやその後の保守に苦しむプログラマーへ POSIX原理主義のススメ POSIX原理主義に基づくアプリケーションたち POSIX原理主義に対する誤解 20年後など、誰も責任を取ってはくれない 本書の効果的な活用方法 第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コマンドの活用 - mkfifoコマンド入門 - mkfifoの応用例 - 使用上の注意 4-4 一時ファイルを作らずファイルを更新する - シンボリックリンクであった場合に実体を探す方法 - ACL付きやパーミッションが変更されているファイルへの対応 - 一時ファイルなしで上書きするトリック 4-5 テキストデータの最後の行を消す 4-6 改行なし終端テキストを扱う 4-7 IPアドレスを調べる(IPv6も) - シェル変数で受け取りたい場合は? - 補足 4-8 YYYYMMDDhhmmssを年月日時分秒に簡単に分離する 4-9 祝日を取得する 4-10 ブラックリスト入りした100件を1万件の名簿から除去する - joinコマンドチュートリアル - joinコマンドの解説 - joinコマンド使用上の注意 第5章 原理主義テクニック 5-1 PIPESTATUSさようなら - シェル関数を使わない方法もある 5-2 Apacheのcombined形式ログを扱いやすくする - コマンド化したものをGitHubにて提供中 5-3 シェルスクリプトで時間計算を一人前にこなす - 日常の時間 → UNIX時間 - UNIX時間 → 日常の時間 - コマンド化したものをGitHubにて提供中 5-4 findコマンドで秒単位にタイムスタンプ比較をする 5-5 CSVファイルを読み込む - CSVファイル(RFC 4180)の仕様を知る - 仕様に基づき、CSVパーサー「parsrc.sh」を実装する 5-6 JSONファイルを読み込む - JSON&XMLパーサーという「車輪の再発明」の理由 5-7 XML、HTMLファイルを読み込む 5-8 全角・半角文字の相互変換 5-9 ひらがな・カタカナの相互変換 5-10 バイナリデータを扱う 5-11 ロック(排他・共有)とセマフォ - セマフォ - 共有ロック・セマフォの実装のまとめ 5-12 デバッグってどうやってるの? - teeコマンド仕込みデバッグ - 実行ログ収集デバッグ - teeコマンドについて - setコマンドの-vと-xオプションについて - 実行ログを恒久的に残すか 第6章 原理主義テクニック ― Web編 6-1 URLデコードする 6-2 URLエンコードする 6-3 Base64エンコード・デコードする - Base64コマンドの使い方 6-4 CGI変数の取得(GETメソッド編) 6-5 CGI変数の取得(POSTメソッド編) 6-6 Webブラウザーからのファイルアップロード 6-7 Ajaxで画面更新したい - POSIX原理主義者的Ajaxチュートリアル 6-8 シェルスクリプトでメール送信 - Step(0/3)必要な非POSIXコマンド - Step(1/3)英数文字メールを送ってみる - step(2/3)本文が日本語のメールを送ってみる - step(3/3)件名や宛先も日本語化したメールを送る - step(3/3)の作業の完全自動化シェルスクリプトを公開 6-9 メールマガジンを送る 6-10 HTMLテーブルを簡単キレイに生成する - mojihameコマンドチュートリアル 6-11 シェルスクリプトおばさんの手づくりCookie(読み取り編) 6-12 シェルスクリプトおばさんの手づくりCookie(書き込み編) 6-13 シェルスクリプトによるHTTPセッション管理 第7章 知らないとハマるさまざまな落とし穴 7-1 名前付きパイプからリダイレクトするときの落とし穴 7-2 全角文字に対する正規表現の扱い 7-3 sortコマンドの基本と応用と落とし穴 - 基本編 各行を単なる1つの単語として扱う - 応用編 複数の列から構成されるデータを扱う - 落とし穴編 区切り文字に潜む落とし穴2つ 7-4 sedのNコマンドの動きが何かおかしい 7-5 標準入力以外からAWKに正しく文字列を渡す 7-6 AWKの連想配列が読み込むだけで変わる落とし穴 7-7 while readで文字列が正しく渡せない 7-8 あなたはいくつ問題点を見つけられるか!? - 概要 - まとめ 付録 レシピを駆使した調理例 郵便番号から住所欄を満たすアレをシェルスクリプトで 索引