################################################################################ # 「すべてのUNIXで20年動くプログラムはどう書くべきか」目次 # ################################################################################ 【本文目次】 まえがき =================================================================== iii 序章 POSIX原理主義:その本質と可能性、実践方法を理解する ===================== 1 デプロイやメンテに苦しむプログラマーへ .................................. 2 ソフトウェア業界にはびこる問題と、解決のための鍵 ........................ 2 プログラムに高い互換性と長い寿命を与えるPOSIX原理主義 ................... 4 POSIX原理主義の中身 ..................................................... 8 POSIX原理主義に基づくアプリケーションたち .............................. 13 POSIX原理主義プログラミングを始める .................................... 19 筆者への連絡先 ......................................................... 29 第1章 どの環境でも使えるシェルスクリプトを書く……文法・変数編 ============== 31 1-1 $((式)) ................................................................ 32 1-2 /dev/stdin、stdout、stderr ............................................. 32 1-3 `〜` (コマンド置換) .................................................. 32 1-4 [^〜] (シェルパターン) ............................................... 34 1-5 case文/if文 ........................................................... 34 1-6 local修飾子 ............................................................ 35 1-7 PIPESTATUS変数 ......................................................... 36 1-8 set -m(shの-mオプション) ............................................. 36 1-9 環境変数などの初期化 ................................................... 37 1-10 最終行の改行は、省略すべきでない ....................................... 37 1-11 シェル変数 ............................................................. 38 1-12 スコープ ............................................................... 39 1-13 正規表現 ............................................................... 39 1-14 文字クラス ............................................................. 40 1-15 乱数 ................................................................... 40 1-16 ロケール ............................................................... 41 第2章 どの環境でも使えるシェルスクリプトを書く……正規表現編 ================ 45 2-1 知っておくべきメタ文字セットは3つ ...................................... 46 - 各コマンドがどのメタ文字セットに対応しているか ....................... 46 2-2 BRE(基本正規表現)メタ文字セット ...................................... 47 2-3 ERE(拡張正規表現)メタ文字セット ...................................... 49 2-4 AWKで使えるメタ文字セット .............................................. 50 第3章 どの環境でも使えるシェルスクリプトを書く……コマンド編 ================ 53 3-1 「[」コマンド .......................................................... 54 3-2 AWKコマンド ............................................................ 54 3-3 bcコマンド ............................................................. 58 3-4 dateコマンド ........................................................... 58 3-5 duコマンド ............................................................. 58 3-6 echoコマンド ........................................................... 60 3-7 envコマンド ............................................................ 61 3-8 execコマンド ........................................................... 62 3-9 foldコマンド ........................................................... 62 3-10 grepコマンド ........................................................... 63 3-11 headコマンド ........................................................... 63 3-12 iconvコマンド .......................................................... 64 3-13 ifconfigコマンド ....................................................... 65 3-14 killコマンド ........................................................... 65 3-15 mktempコマンド ......................................................... 66 3-16 nlコマンド ............................................................. 67 3-17 odコマンド ............................................................. 68 3-18 printfコマンド ......................................................... 69 3-19 psコマンド ............................................................. 70 3-20 readlinkコマンド ....................................................... 71 3-21 sedコマンド ............................................................ 72 3-22 sleepコマンド .......................................................... 73 3-23 sortコマンド ........................................................... 73 3-24 tacコマンド/tailコマンド+-rオプションによる逆順出力 .................. 73 3-25 test([)コマンド ...................................................... 74 3-26 trコマンド ............................................................. 75 3-27 trapコマンド ........................................................... 76 3-28 whichコマンド .......................................................... 76 3-29 xargsコマンド .......................................................... 77 3-30 zcatコマンド ........................................................... 80 第4章 Hors d'oeuvre:ちょっとうれしいレシピ ================================= 83 4-1 sedによる改行文字への置換を、キレイに書く .............................. 84 4-2 grepに対するfgrepのような素直なsed ..................................... 87 4-3 mkfifoコマンドの活用 ................................................... 89 - mkfifoコマンド入門 ................................................... 89 - mkfifoの応用例 ....................................................... 90 - 使用上の注意 ......................................................... 92 4-4 一時ファイルを作らずファイルを更新する ................................. 93 - シンボリックリンクであった場合に実体を探す方法 ....................... 94 - ACL付きやパーミッションが変更されているファイルへの対応 .............. 95 - 一時ファイルなしで上書きするトリック ................................. 96 4-5 テキストデータの最後の行を消す ......................................... 98 4-6 改行なし終端テキストを扱う ............................................ 100 4-7 IPアドレスを調べる(IPv6も) .......................................... 103 - シェル変数で受け取りたい場合は? .................................... 104 - 補足 ................................................................ 105 4-8 YYYYMMDDhhmmssを年月日時分秒に簡単に分離する .......................... 106 4-9 祝日を取得する ........................................................ 108 4-10 ブラックリスト入りした100件を1万件の名簿から除去する .................. 112 - joinコマンドチュートリアル .......................................... 113 - joinコマンドの解説 .................................................. 114 - joinコマンド使用上の注意 ............................................ 116 第5章 POSIX原理主義テクニック ============================================== 117 5-1 PIPESTATUSさようなら .................................................. 118 - シェル関数を使わない方法もある ...................................... 121 5-2 Apacheのcombined形式ログを扱いやすくする .............................. 123 - コマンド化したものをGitHubにて提供中 ................................ 126 5-3 シェルスクリプトで時間計算を一人前にこなす ............................ 127 - 日常の時間→UNIX時間 ................................................ 127 - UNIX 時間 → 日常の時間 ............................................. 128 - コマンド化したものをGitHubにて提供中 ................................ 129 5-4 findコマンドで秒単位にタイムスタンプ比較をする ........................ 131 5-5 CSVファイルを読み込む ................................................. 135 - CSVファイル(RFC 4180)の仕様を知る ................................. 136 - 仕様に基づき、CSVパーサー「parsrc.sh」を実装する .................... 137 5-6 JSONファイルを読み込む ................................................ 139 - JSON&XMLパーサーという「車輪の再発明」の理由 ....................... 141 5-7 XML、HTMLファイルを読み込む ........................................... 143 5-8 JSONファイルを生成する ................................................ 146 - Step(0/4)必要なコマンド ........................................... 146 - Step(1/4)元データとその形式 ....................................... 146 - Step(2/4)求められるJSONデータ構造 ................................. 147 - Step(3/4)変換シェルスクリプトを書く ............................... 148 - Step(4/4)変換シェルスクリプトを書く ............................... 150 - 補足―makrj.sh使用上の注意 .......................................... 151 5-9 全角・半角文字の相互変換 .............................................. 154 5-10 ひらがな・カタカナの相互変換 .......................................... 157 5-11 バイナリーデータを扱う ................................................ 160 5-12 ロック(排他・共有)とセマフォ ........................................ 164 - 共有ロック・セマフォの実装のまとめ .................................. 171 5-13 1秒未満のsleepをする .................................................. 175 5-14 デバッグってどうやってるの? .......................................... 179 - teeコマンド仕込みデバッグ ........................................... 180 - 実行ログ収集デバッグ ................................................ 182 - teeコマンドについて ................................................. 184 - setコマンドの-vと-xオプションについて ............................... 184 - 実行ログを恒久的に残すか ............................................ 184 第6章 POSIX原理主義テクニック……Web編 ===================================== 187 6-1 URLデコードする ....................................................... 188 6-2 URLエンコードする ..................................................... 190 6-3 Base64エンコード・デコードする ........................................ 193 - Base64コマンドの使い方 .............................................. 193 6-4 CGI変数の取得(GETメソッド編) ........................................ 195 6-5 CGI変数の取得(POSTメソッド編) ....................................... 198 6-6 Webブラウザーからのファイルアップロード ............................... 200 6-7 シェルスクリプトおばさんの手づくりCookie(読み取り編) ................ 204 6-8 シェルスクリプトおばさんの手づくりCookie(書き込み編) ................ 206 6-9 Ajaxで画面更新したい .................................................. 210 - POSIX+W3C原理主義によるAjaxチュートリアル .......................... 210 6-10 HTMLテーブルを簡単キレイに生成する .................................... 215 - mojihameコマンドチュートリアル ...................................... 215 6-11 シェルスクリプトでメール送信 .......................................... 222 - Step(0/3)必要なPOSIX外コマンド .................................... 222 - Step(1/3)英数文字メールを送ってみる ............................... 223 - Step(2/3)本文が日本語のメールを送ってみる ......................... 224 - Step(3/3)件名や宛先も日本語化したメールを送る ..................... 225 - Step(3/3)の作業の完全自動化シェルスクリプトを公開 ................. 227 6-12 シェルスクリプトでメール送信(添付ファイル付き) ...................... 228 - Step(1/5)本文や添付ファイルをBase64エンコード ..................... 230 - Step(2/5)マルチパート内ヘッダーをつける ........................... 230 - Step(3/5)各本文・添付ファイルの前後行に境界文字列行を置く ......... 232 - Step(4/5)「Content-Type: multipart/mixed; boundary="HOGEHOGE"」 を加えてメールヘッダー作成 ............................... 233 - Step(5/5)sendjpmailコマンドに流し込み、メール送信 ................. 234 - 注意 ................................................................ 234 6-13 他のWebサーバーへのファイルアップロード ............................... 235 - Step(1/3)マルチパート内ヘッダーをつける ........................... 238 - Step(2/3)各本文・添付ファイルの前後行に境界文字列行を置く ......... 239 - Step(3/3)「Content-Type: multipart/form-data; boundary="HOGEHOGE"」 をヘッダーに加えてWebアクセス ............................ 240 6-14 シェルスクリプトによるHTTPセッション管理 .............................. 242 6-15 メールマガジンを送る .................................................. 248 6-16 Twitterに投稿する ..................................................... 252 - Step(1/4)小鳥男をインストールする ................................. 252 - Step(2/4)Twitterユーザーアカウント登録 ............................ 253 - Step(3/4)アクセスキーを手に入れる ................................. 253 - Step(4/4)動かしてみる ............................................. 255 第7章 知らないとハマる さまざまな落とし穴 ================================== 265 7-1 名前付きパイプからリダイレクトするときの落とし穴 ...................... 266 7-2 /dev/stderr(inもoutも)でなぜかPermission denied ..................... 269 - 回避方法のまとめ .................................................... 270 7-3 全角文字に対する正規表現の扱い ........................................ 273 7-4 sortコマンドの基本と応用と落とし穴 .................................... 275 - 基本編 各行を単なる1つの単語として扱う .............................. 275 - 応用編 複数の列から構成されるデータを扱う ........................... 277 - 落とし穴編 列区切り文字に潜む落とし穴2つ ............................ 280 7-5 sedのNコマンドの動きが何かおかしい .................................... 284 7-6 bashで動かすために注意すべきこと ...................................... 287 7-7 標準入力以外からAWKに正しく文字列を渡す ............................... 290 7-8 AWKの連想配列が読み込むだけで変わる落とし穴 ........................... 292 7-9 while readで文字列が正しく渡せない .................................... 294 7-10 trapコマンドでシグナルが捕捉できない .................................. 296 7-11 あなたはいくつ問題点を見つけられるか!? .............................. 299 - 概要 ................................................................ 299 - まとめ .............................................................. 303 付録 レシピを駆使した調理例 ================================================ 305 A-1 郵便番号から住所欄を満たすアレをシェルスクリプトで .................... 306 索引 ======================================================================= 318 【コラム】 1 「シェルショッカー 1号男」は侵略型ショッピングカート ................... 52 2 truncate コマンド ...................................................... 82 3 ヒストリーを残さずログアウト .......................................... 111 4 38年動き続けているプログラム .......................................... 126 5 同じ文字が連続した文字列を作る ........................................ 130 6 おススメはしないけど…… .............................................. 192 7 【緊急】false コマンドの深刻な不具合 .................................. 286