written by 松浦智之(シェルスクリプトマガジン編集部)
シェルスクリプトは何に使う言語なのか?残念ながら、作業の自動化やサーバー管理に使うものだと捉えている方が多い。私が、「いや、システム開発のためにこそ使うものだ」といっても、冗談あるいは曲芸の類にしか見てもらえないことが多い現状は、シェルスクリプトマガジン編集者としては悔しいものだ。
大手雑誌でシェルスクリプトが特集されることはあっても、データ管理術を手解きする特集で使われている道具はMySQL……。そこでもやはりシェルスクリプトが利用されるまでに、世の中のイメージを変えたい、というのが私の夢である。
そこで今回の記事では、私が実装したシェルスクリプト製「郵便番号から住所を補完するボタン」を紹介する。これを通じて、シェルスクリプトの実力、そして我々シェルプログラマーの愉しみを見てもらいたい。
なお、実際にシェルスクリプトによる業務システム開発を行っているUSP研究所では有償コマンド(usp Tukubai)を用いていて、「それがあるから実用的なものが作れるんでしょ?」と思うかもしれないが、そんなことはない。誰でも入手できるごくありふれたUNIXコマンドだけでここまでできる!ということが、今回の記事を通じてわかってもらえればと思う。
世間では未だに「シェルスクリプトなんて遅くて使えない」という偏見が根強い。いやいや「ちょっと待ったー!」と言いたい。
シェルスクリプトはグルー言語。シェルスクリプト自身でこなそうとせずに、コマンドを呼んでそれらに任せればいいのだ。コマンドを呼べば、シェルスクリプトはそのコマンドの終了を待つだけになる。UNIX標準コマンドたちはC言語で書かれているため、この仕組みを理解した上で組まれたシェルスクリプトなら、殆どCプログラムの速さで動くことになる。
また、データが100万行、1000万行におよんでも、データの持たせ方の工夫次第で処理速度は改善できる。例えば後述の郵便番号の例なら、前3桁ごとにファイル分割して持てばいいのだ。頭の3桁の検索は、OSがファイルシステムのハッシュテーブルを使って高速に行ってくれるので、わざわざ自力で高速検索アルゴリズムを組む必要は無い。
シェルスクリプトには他の言語みたいに豊富なライブラリーもないからたいしたことができない、という意見も根強いが、これも工夫次第で想像以上にいろんなことができる。
例えば今回紹介するデモでは、CSVやJSON、XMLテキストの解析をさせている。たしかにそんなことをしてくれるコマンドは無かったが、シェルスクリプトとsedやAWKやgrep、trなど、どれも見慣れた構文やコマンドでできている。 難しいことも、簡単なことの組み合わせで実現できるのがシェルスクリプトの強み であり(マイクガンカーズのUNIX哲学定理6,7あたり) 、シェルプログラミングの愉しみはこのような「工夫」にこそあるはずだ。
「じゃあ、Webアクセスは?」
……それもデモで示すとおり、curlやwgetコマンドを使えばOK。
「メールは?」
……それは/usr/sbin/sendmailを使えば大丈夫、受信ならfetchmailコマンドとか。
「でも、本格的なRDB操作はさすがに無理でしょ」
……いやいや、 POSIX標準コマンドでjoinってのがあって これやsort、AWKなど使えば、テキストファイルでも相当本格的な操作が可能。
このようにUNIX標準コマンドには、様々な用途に利用できる必要十分なコマンドがそろっている。あとは我々シェルプログラマーがこれらをどう使うか、だ。
というわけで、シェルスクリプトの実力を示すべく、ネット通販の注文画面なんかでよく見かける 「郵便番号から住所を補完するボタン」 をシェルスクリプトで実装してみた。