前回は、VMware playerでシェルスクリプト環境を構築する方法を紹介しましたが、本稿では実際にシェルスクリプトを使ってファイル処理を試してみましょう。

VMware playerの環境構築はこちらを参照してください。

真偽判定の方法 testコマンドと変数

必要なコマンドを連ねていくのがシェルスクリプトの基本ですが、それだけでは一本道の単純な作業しかできません。作業の過程で条件分岐を挟み、続く作業を変更することで処理内容を多様化することができます。シェルスクリプトの中で条件分岐させるには「test」というコマンドを用います。

testコマンドの条件分岐にはさまざまなものがありますが、本稿では「-f」というオプションを使います。「test -f <ファイル名>」と入力すると、「ファイル名」が普通のファイルとして存在するかチェックします。「ファイル名」が通常のファイルとして存在すれば「真」、ファイル名と名前がマッチしてもディレクトリであったり、マッチするファイル名がなければ「偽」となります。

Ubuntuに「checkfile」という空のファイルをtouchコマンドで作成し、プロンプトから以下のように入力します。

デスクトップへと移行するにはcd ~/デスクトップと入力します。

ファイルを作成してtestコマンドを実行する

user@ubuntu-vm:~/デスクトップ$ touch checkfile
user@ubuntu-vm:~/デスクトップ$ test -f checkfile

「test -f checkfile」は、「checkfile」という名前のファイルが現在のディレクトリにあるかないかを調べています。しかし、プロンプトから入力すると結果は表示されずに戻ってきてしまいます。このtestコマンドの結果を見るには先ほどのechoコマンドを使います。「echo $?」と入力すると、直前に実行したコマンドの結果が表示できます。「$?」は「変数」と呼ばれるもので、「$?」は「直前のコマンドの結果」を意味します。変数は通常のコマンド入力にはほとんど使いません。

ですが、シェルスクリプトでは条件分岐や作業内容に必要な情報を入力するために、ほぼ必須の項目です。身近なところではプロンプトの文字やファイルの特性によって端末での表示色が変わるのは、ログイン時のシェルスクリプトが「環境変数」としてセットされているためです。変数の扱いは状況によって変わるのですが、ここではまだ「セットされた内容を表示するもの」と覚えておけば大丈夫です。

真偽という二択の判定結果では、返り値(コマンドの終了時に出力する値)に「真」(ここではファイルがあれば)は「0」、「偽」(ファイルが存在しない)は「1」を返します。改めて、次のように2つのコマンドを入力すると、echoコマンドの結果が「0」と表示され、テストした結果、checkfileという本物のファイルがある(真)ということがわかります。

testコマンドの結果を表示する

user@ubuntu-vm:~/デスクトップ$ test -f checkfile
user@ubuntu-vm:~/デスクトップ$ echo $? ★1
0 ★2
user@ubuntu-vm:~/デスクトップ$
★1:直前のコマンドの結果を表示させる
★2:結果は「真」であると変数「$?」にセットされている

デスクトップ上にはcheckfileという本物のファイルがあります。このtestコマンドの結果は「真」なので、変数「$?」には「0」がセットされ、echoコマンドでそれが表示されています。そこで、checkfileを削除して、同名のサブディレクトリを作成してみましょう。

同名のファイルがサブディレクトリであった場合

user@ubuntu-vm:~/デスクトップ$ rm checkfile ★1
user@ubuntu-vm:~/デスクトップ$ mkdir checkfile ★2
user@ubuntu-vm:~/デスクトップ$ test -f checkfile ★3
user@ubuntu-vm:~/デスクトップ$ echo $? ★4
1 ★5
user@ubuntu-vm:~/デスクトップ$
★1:checkfileを削除
★2:checkfileというサブディレクトリを作成
★3:checkfileという名前をテストする
★4:結果を表示させる
★5:結果は「偽」であると変数「$?」にセットされている

今度はマッチする「ファイル」はありましたが、それはサブディレクトリであって、本来のファイルではありません。そのため、testコマンドの結果は「偽」となり、変数「$?」には「1」がセットされるようになります。このように、真の場合は変数「$?」は「0」、偽の場合は「1」がセットされることがわかります。条件分岐はこのような変数にセットされた情報を元に行われます。