
第8回 bashで始めるシェルスクリプト基礎の基礎
関野史朗
2002/2/5
条件式と繰り返しによるスクリプトの制御
■条件判断
引数によって実行時にパラメータを与えることができるようになりました。次に欲しくなるのは、条件判断でしょう。つまり、特定の条件が満たされたときだけコマンドを実行するということです。このための構文が「if文」で、
if 条件文 |
という構造で使います。このうち「elif」はなくてもよいですし、好きなだけ繰り返すこともできます。また、「else」は使わない、あるいは1回だけ使えます。
ここで注意が必要なのは、条件が式ではなく文であることです。すなわち、一般的な真偽によって実行するかしないかを決定するのではないのです。では一体何をもって判断するのかというと、実行した文の「終了ステータス」です。
Linuxでは、あらゆる実行ファイルが終了時に自分自身を呼び出したプロセスに対して整数のコードを返します。これが終了ステータスで、普通は正常に終了したときに「0」を、エラーが発生した場合などはそれに応じた数値を返します。そして、この終了ステータスが0であることが、すなわち真ということになります。言い換えれば、条件文が正常に実行を終了すれば、真であるということです。従って、
if コマンドが正常に終了した |
という言い回しが成立します。
これでは一般的な条件判断を行うのが難しくなります。そこで、testコマンドが用意されました。このコマンドは、続く条件式を評価して、真ならば0を、偽ならば1を終了ステータスとして返します。このままではちょっと分かりにくいので、「[]」として使えるようになっています。
if [ $# -eq 1 ] |
というシェルスクリプトなら、引数の数に応じた答えを返します。
testコマンドで使える条件式は、manコマンドで調べられます。代表的なところでは、
|
条件式
|
意味
|
|
| s1 = s2 | 文字列s1とs2が等しい | |
| s1 != s2 | 文字列s1とs2が等しくない | |
| n1 -eq n2 | 数値n1とn2が等しい | |
| n1 -ne n2 | 数値n1とn2が等しくない | |
| -e file | fileが存在する | |
| -z s1 | s1の長さが0である |
といったものがあります。
■すべてのファイルに同じ処理を
シェルスクリプトの中で私が一番重宝しているのは、「forループ」です。CやPascalといったプログラミング言語にもforループは用意されていますが、シェルスクリプトのforループはちょっと違います。CやPascalでは特定回数のループを実行するのに使われますが、シェルスクリプトでは複数のファイルに対して同じ処理を行うためにあるといっていいでしょう。どちらかというと、オブジェクト指向言語でいうイテレータに近い存在です。
構文は、
for 識別子 in リスト |
です。これで、リストの内容を1つずつ識別子に代入して、それぞれについてdoとdoneで囲まれた部分を実行します。
簡単な例で試してみましょう。以下の内容のスクリプトをgreeting2.shとして作成します。
#!/bin/sh |
これに3つの引数を与えて実行すると、
$ ./greeting2.sh tom joe mike |
となります。単純な$*とforループの違いが分かるでしょうか?
実際に私が使っているスクリプトに、
#!/bin/sh |
というものがあります。カレントディレクトリにあるJPGファイルすべてのサムネイルを作り、サムネイル一覧と元のファイルへのリンクを持ったHTMLファイルを出力します。肝はforループで、ループ内の1行目で縦横を20%に縮小したPNGファイルを作り、これをサムネイルとします。ループ内2行目では「<A HREF="scan01.jpg"><IMG SRC="scan01.png" alt="scan01.jpg" hspace="2"></A>」といった行を作って出力します。これを、JPGファイルの数だけ繰り返すわけです。
■特定条件での繰り返し
特定の条件が成立している間、繰り返し処理を行うという場合は、whileかuntilを使います。構文としては、
while 条件文 |
となり、条件文についてはforループと同じ扱いになります。終了ステータスが0なら真、0以外なら偽ということです。この点を除けば、CやPascalのwhileループに似ています。
簡単な例として、PATHに設定されている文字列を分解してみましょう。シェルスクリプトは、
#!/bin/sh |
で、実行例は、
$ echo $PATH |
です。
手抜きのススメ
シェルスクリプトは制御構造を持っており、かなり高度な作業が行えます。その分、理解して使うにはちょっと苦労するかもしれません。しかし、最初に苦労してしまえば後でずっと楽ができます。また、分からない機能を無理して使わなくても、繰り返し利用するコマンドをまとめるだけでも、ずいぶん省力化できます。ぜひシェルスクリプトを活用して、楽をしましょう。
| シェルスクリプトのより詳しい解説は、 連載:ステップ・バイ・ステップ・シェルスクリプト を参照ください。 |
|
2/2
|
|
| Index | |
| Windowsユーザーに教えるLinuxの常識 | |
| シェルスクリプトの基本はコマンドを並べること シェルスクリプトによる出力の制御 引数と変数で柔軟性を実現 |
|
| 条件式と繰り返しによるスクリプトの制御 手抜きのススメ |
|
| 連載 Windowsユーザーに教える Linuxの常識 |
| Linux Squareフォーラム Linux/システム学習関連記事 |
| 連載:Windowsユーザーに教えるLinuxの常識(全12回) Windowsのセオリーが通用しないLinux。Linux初心者向けに、LinuxというOSの考え方/常識をゼロから伝授! |
|
| 連載:LFSで作って学ぶLinuxの仕組み(全4回) 管理者(root)は、何をしなければならないのか? 管理に際して検討すべきことは? 管理のための技術とは? など、駆け出し管理者のための考え方や方法論を検討する |
|
| 連載:Linux管理者への道(全8回) 「Linux From Scratch」というシンプルなLinuxをインストール&環境構築する作業を通して、LinuxがOSとして機能するための仕組みや設定を見直そう |
|
| Linux Squareフォーラム全記事インデックス |
|
TechTargetジャパン
- 高速化に効くシステムコールが犠牲にするもの (2012/2/21)
プログラムの処理速度を上げるシステムコールは確かに存在するが、犠牲にしているものがあることを忘れてはいけない - Firefoxは「メモリ食い」という悪評を払拭できるか (2012/2/20)
Firefoxからユーザー離れが進んでます。メモリを浪費するというのがその理由。しかし、改善への取り組みが成果を上げています - クライアントがアクセスできる範囲を制限する (2012/2/10)
今回は、サーバ上のファイルの扱いに関係する設定項目について解説します - 新しい記事も入っていて安心しました (2012/2/7)
Linux Squareのアクセスランキングを公開します。定番の記事ばかりでなく、連載中の記事もよろしくお願いいたします
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -
