前回までに多用したifコマンドでは、「もしも~ならば○○をする」といった条件によって、処理を変える仕組みでした。今回紹介する「for」コマンドは、「一定の処理を繰り返す」という仕組みです。この「仕組み」も何かをプログラムしたい場合にはよく使われます。
VMware playerの環境構築はこちらを参照してください。
基本的な書式は以下のようになります。
forコマンドの基本構造
for 変数 in リスト
do 実行コマンド
done
forコマンドの繰り返し作業では、まず変数を指定します。「in」でリストアップする条件を指定し、マッチした内容が変数にセットされます。そして「do」で実際のコマンドが実行されます。inの条件でマッチするものが複数あれば、次の内容がforの新しい変数としてセットされ、またdoで処理されます。リストアップ条件にマッチするものがなくなったら「done」で作業を終了します。
ここでの目的は「拡張子がmp3のファイルをサブディレクトリmp3にコピーする」ということです。最初にforに対する「変数」の名前を決めます。これはユーザーが区別できるものであれば、どのような名前でも構いません。ここでは「FILE」とします。次にinでリストアップする条件ですが、「拡張子がmp3ファイルであること」です。ですからリストアップ条件は「in *.mp3」となります。
doに続くコマンドは、変数FILEの値(拡張子がmp3のファイル)をmp3ディレクトリへコピーするので「cp $FILE mp3/$FILE」となります。「$FILE」というのは、変数「FILE」に入力された値です。このスクリプトが実行されるときには、inでリストアップされた実際のファイル名が入ります。
作業対象のファイル名があらかじめ決まっているのなら別ですが、ここでの目的のように、対象が複数あって随時変化するするような時、あらかじめ任意の変数を作っておきます。そして実行時にその変数に値を入力して作業させるというわけです。
inでリストアップされたmp3ファイルが全部コピーされれば、inのリストアップはなくなり、このスクリプトは終了します。実際にstep4.shとして記述してみると、以下のようになります。
step4.shの内容
#/bin/sh
for FILE in *.mp3
do
echo "$FILEを ./mp3/$FILEにコピーします"
cp $FILE mp3/$FILE
done
「echo "$FILEを ./mp3/$FILEにコピーします"」の1行は本来不要ですが、変数FILEが変化していく様子を確認するために追加したものです。実行すると、変数「FILE」が「in」でリストアップしたファイル名に置き換わり、次々と送られていきます。そしてそのファイル名はどんどん変化します。
step4.shの実行結果
user@ubuntu-vm:~/デスクトップ$ ./step4.sh
sample1.mp3を ./mp3/sample1.mp3にコピーします ★1
sample2.mp3を ./mp3/sample2.mp3にコピーします ★2
sample3.mp3を ./mp3/sample3.mp3にコピーします ★3
user@ubuntu-vm:~/デスクトップ$ ★4
★1 変数FILEはsample.mp3がセットされている
★2 変数FILEは次のリストファイル、sample2.mp3がセットされる
★3 変数FILEが次のリストファイルに変化した
★4 すべてのmp3ファイルをコピーしたのでスクリプトを終了した
繰り返し処理にはwhileコマンドを用いることもあります。whileは指定条件が「真」の間、同じ作業を繰り返すというものです。逆に言えば、指定された条件が「偽」にならない限り延々と同じ作業を続ける(ループしてしまう)ため、条件はより正確に記述する必要があります。そのためwhileを停止させるための条件文も作ることもあります。繰り返し作業をするのにforとwhileのどちらかを使うかはケースバイケースで、今回はファイルのリストアップが必要で、その指定が簡単なforを用いた、ということになります。
シェルスクリプトの中では、「$」や「*」、「\」といった特殊な文字は「''」や「""」で囲まれている(クォーティングと言います)ときと、クォーティングされていない場合では違った働きをします。特に変数を表示させたい時には注意してください。
面倒なシェルスクリプトなど使わずにマウスで範囲指定、フォルダにコピーした方がよほど簡単ではないか。そう思われるかもしれません。ですが、シェルスクリプト内に追加できるのは、なにもcpコマンドだけではないのです。
シェルスクリプトでは複数のエンコードが混じった音楽フォルダをひとつのフォーマットに統一したり、特定のファイルだけを別のエンコードに直して別のディレクトリにコピーするといったこともできます。音楽フォーマットだけでなく、画像ファイルフォーマットの変更も可能です。