Hatena::ブログ(Diary)

分室の分室 このページをアンテナに追加

2011-06-19 Sun

【101】シェルスクリプト…未知なる衝撃の連続…

			

要するに、行き詰まり…

 前回の仕様書は、結構な長文だったので、いざコーディング…といっても、どこ から着手すればいーんだか、ちょっと途方に暮れた。が、基本はバッチ処理を羅列 するだけで良いはず。何とかなるだろう…と思っていたんだけど。  いざ、やろうと思うと、自分が bash とシェルスクリプトのことを全く知らない ことを思い知らされた。例えば… ・Perl の die みたいな例外処理で実行を中止するのは、どうやるのか… ・シェルスクリプトで、リストをループ処理する方法は…  もう、このレベルの段階で、さっぱりワカラン。リスト処理については… for %%f in (%path% .) do if exist %%f\lm.env set lmcfg=%%f\lm.env …こんな感じが bash でも使えるんだろうって思ってたんだけど。ちなみにこれは DOS のバッチファイルの記述例なんだけどね。  Linux での ${PATH} の区切り文字は『:』だけど、: はリストの区切り文字とし て使えるのか?  このぐらいの事は、実際に検証し、試してみれば良い。↓ [foo@www-lin ~]$ for i in $PATH; do echo $i; done /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/foo/bin  やっぱり、駄目。このパスのリストを分解するには、どうすれば良いのか。Web で検索してみたら、シェル変数 IFS を使えば良いらしいことが分かった。↓ [winfoo@www-lin ~]$ set | grep ^IFS IFS=$' \t\n'  でも、疑問が生まれる度に調べるってのは面倒臭いので、久々に書籍を新規購入 することにした。とりあえず、次の書籍を購入。↓ ---------------------------------------------------------------------- ● 書名:わかる! 使える! Linux コマンド&シェル 著者:福田和宏/米田 聡 ←(奥付には表記されていないが…) (C)日経BP社 福田和宏, 米田 聡 日付:(発行日) 2008年 8月 1日 初版発行 媒体:ムック(雑誌 66993-40) 造本:A4判/248頁 (表1〜表4 を除外した頁数) 発行:日経BP社 発売:日経BP出版センター ISBN:978-4-8222-3417-1 定価:本体2,400円+税 備考:foussin所有。2011.06.16 Thu に購入。索引がないのがネックだけど、 最初から読み進めていけば、チュートリアルとして使えると思う。 ---------------------------------------------------------------------- ● 書名:詳解 シェルスクリプト 著者:Arnold Robbins(アーノルド・ロビンス)/ Nelson H. F. Beebe(ネルソン・H・F・ベーブ) 訳者:日向あおい(ひゅうが あおい) 日付:(発行日) 2006年 1月25日 初版第1刷発行 2008年 9月26日 初版第6刷発行 媒体:書籍 発行:株式会社オライリー・ジャパン 発売:株式会社オーム社 ISBN:978-4-87311-267-2 定価:本体2,800円+税 備考:foussin所有。2011.06.16 Thu に購入。 ----------------------------------------------------------------------  さっきのヤツだが、IFS に区切り文字 : を追加して再実行すれば…↓ [winfoo@www-lin ~]$ IFS=$': \t\n'; for i in $PATH; do echo $i; done /usr/local/bin /bin /usr/bin /usr/local/sbin /usr/sbin /sbin /home/winfoo/bin [winfoo@www-lin ~]$ set | grep ^IFS IFS=$': \t\n'  今度は、ちゃんと実行できた。この処理をスクリプトに記述した場合は、シェル 変数 IFS の設定値は実行プロセス中でのみ有効なため、スクリプトが終了すれば 元の設定に戻るハズ。  リスト処理は、まあ分かった。でも die が分からない。どうやら、冗長な制御 構造を記述するしかないのかもしれない…。  ただね。こういう、ちょっとした検証を簡便に行いたいからこそ、lm を作って いるわけで、lm を作っている最中に何度も検証するのは面倒至極なわけでして。  それならば、lm については『既知の言語 Perl』で作って、lm が稼動する環境 が出来てから、bash の使い方を少しづつ覚えた方が効率が良さそうだ…そう思う ようになってきた。  そんな訳で、lm は Perl で記述することにした。で、lm.env とか、少なからず 仕様は変わることになりそう。今回は、ここまで。