条件分岐の基本 ifコマンド

何かひとつ、mp3ファイルをUbuntuのデスクトップにsample1.mp3という名前でアップロードしてください(ファイル転送ができなければtouchコマンドでこの名前のファイルを作ってもかまいません)。そして新しく「mp3」というサブディレクトリを作成します。その後、次のようなシェルスクリプト(step2.shとします)を作成してみましょう。

step2.shの内容

#/bin/sh
if test -f *.mp3
then cp *.mp3 ./mp3
else echo "該当ファイルはありません"
fi

とても簡単な条件分岐スクリプトです。「if」は和訳通りの「もしも」。testコマンドは拡張子がmp3というファイルの存在を調べます。そして「then」これも英語の通りで、「その場合は」という働きをします。つまり、このスクリプトを強引に日本語にすれば、以下のようになります。

「実行にshコマンドを使うこと」
「もし」「拡張子がmp3というファイルが」
「あるならば」 ←条件A
「そのファイルをmp3サブディレクトリにコピーしなさい」
「ないならば」 ←条件B
『該当ファイルはありません』というメッセージを表示しなさい」
「終了」

真か偽の条件分岐ですから「合致する場合」(条件A)と「合致しない場合」(条件B)の2通りでてくるわけですが、「then」に対応する「else」は合致しない場合に処理するコマンドを引き続き列記します。条件分岐の最後は「if」の逆、「fi」で締めくくります。なお、ここでは「if~then~else~fi」という流れの説明にelseでメッセージ表示を利用しましたが、何もする必要がなければ省略することもできます。このstep2.shを実行すると、デスクトップ上にあるsample1.mp3が、サブディレクトリmp3の中へコピーされるのがわかります。

デスクトップ上にあるsample1.mp3が、サブディレクトリmp3の中へコピーされる

このスクリプトはファイルをコピーするだけなので、現在のディレクトリにはsample1.mp3ファイルは残り続け、何度でも実行できます。これを少し手直しして、cpではなくmvにしてみましょう。

step3.shの内容

#/bin/sh
if test -f *.mp3
then mv *.mp3 ./mp3 ★
else echo "該当ファイルはありません"
fi
★cpをmvに変更する

これをstep3.shとします。一度目の実行はsample1.mp3がありますから、ファイルを移動して成功、終了します。しかしファイルは移動されてしまったので、デスクトップ上には拡張子mp3というファイルはありません。そのため、2回目の実行ではtest結果は「偽」となり、「else」条件のechoメッセージが表示されます。

2回目以降の実行で「偽」になるstep3の実行例

user@ubuntu-vm:~/デスクトップ$ ./step3.sh ★1
user@ubuntu-vm:~/デスクトップ$ ./step3.sh ★2
該当ファイルはありません ★3
user@ubuntu-vm:~/デスクトップ$
★1 ファイルがあるのでサブディレクトリに移動する
★2 デスクトップ上にmp3ファイルはない
★3 elseで指定したメッセージが表示される

step3.shの実行画面

testコマンドのオプション「-f」は、ファイルの存在だけを問題にしています。ファイルがあればコピーする、というだけです。プロンプトから「cp *.mp3 ./mp3」とタイプすれば拡張子mp3のファイルはすべてコピーされるのですが、このシェルスクリプトの条件分岐式ではファイル名まで設定されないため、複数のmp3ファイルが存在するとエラーになってしまいます。

複数のmp3ファイルで「偽」になってしまう例

user@ubuntu-vm:~/デスクトップ$ ls -l *.mp3 ★1
-rw-r--r-- 1 user user  893682 2008-08-27 06:22 sample1.mp3
-rw-r--r-- 1 user user 1077375 2008-08-27 06:22 sample2.mp3
-rw-r--r-- 1 user user 2776379 2008-08-27 06:22 sample3.mp3
user@ubuntu-vm:~/デスクトップ$ ./step3.sh
./step2.sh: line 2: test: too many arguments ★2
該当ファイルはありません ★3
user@ubuntu-vm:~/デスクトップ$
user@ubuntu-vm:~/デスクトップ$ ls -l mp3/
合計 0 ★4
user@ubuntu-vm:~/デスクトップ$
★1:デスクトップ上に複数のmp3ファイルがある
★2:引数が多すぎるというエラーメッセージ
★3:条件は「偽」となりファイルのコピーは実行されない
★4:サブディレクトリにもファイルはコピーされない

このような場合にはいろいろな手法がありますが、簡単な繰り返し処理ならばforコマンドが扱いやすいでしょう。