本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、同じ処理を繰り返し実行する「while」コマンドです。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は同じ処理を繰り返し実行する「while」コマンドです。
「while」は、何かの条件を指定して、繰り返し処理を行う際に使うbashの内部コマンドです。「指定したコマンドの実行結果が成功している間」のように条件を指定します。
whileコマンドは主にシェルスクリプト内で使用します。コマンドラインでも、[CTRL]+[C]で中断するまで、同じコマンドを繰り返し実行したい場合などに役立ちます。
while コマンド; do コマンド; done
while [ 式 ]; do コマンド; done
※[ ]は省略可能な引数を示しています
whileコマンドにはオプションはありません。
whileコマンドは、同じ処理を繰り返し実行したいときに使います。特に、シェルスクリプトの中で、whileコマンドを使った一連の処理のことを「while文」と呼ぶことがあります。
繰り返し処理を行うコマンドは、whileの他にもあります。例えばforコマンド(連載第215回)はリストや回数を指定して繰り返し実行します。これに対して、whileコマンドは「条件が成立している間」という指定で繰り返しの条件を決めます。
コマンドラインで使用する場合、多くは、「while true; do コマンド; done」のように、条件が常に成立するようにして繰り返し処理を続け、キーボードから[CTRL]+[C]を入力することで終了させます。
「true」は何もせずに、実行結果として「成功」(エラーコード0)を返す、というコマンドです。trueを「:」コマンドと置き換えても同じように動作します。
これとは逆に、何もせずに実行結果として「失敗」(エラーコード1)を返してほしい場合は「false」コマンドを使用します(※1)。true、:、falseはいずれもbashの内部コマンドです。
※1 whileコマンドなどで成功と失敗を判断する際、エラーコードが0の場合は成功(真)、エラーコードが0以外の場合は失敗(偽)として扱う。多くのコマンドではエラーコードでエラーの原因を表している。直前に実行したコマンドのエラーコードは「$?」で参照可能だ。コマンドラインで参照したい場合は「echo $?」と実行する。
while true; do コマンド; done
(コマンドを際限なく繰り返す、[CTRL]+[C]で終了)
while :; do コマンド; done
(コマンドを際限なく繰り返す、[CTRL]+[C]で終了)
複数のコマンドを繰り返し実行したい場合は、「do コマンド1;コマンド2;コマンド3;done」のように「;」記号でコマンド間を区切ります。
画面1では「while true; do date; sleep 1;done」を実行しました。まず「date」コマンド(第77回)で現在の時刻を表示し、「sleep 1」コマンド(第66回)を使って1秒間待機しています。つまり、1秒間隔でdateコマンドを実行しています。
なお、「watch」コマンド(第220回)を使って、画面1の処理を書き直すこともできます(画面2)。watchコマンドは、指定した間隔でコマンドを実行します。whileコマンドとは実行結果の表示方法が異なり、フルスクリーンで表示して、常に最新の結果だけが残ります。[CTRL]+[C]で終了します。
「ファイルが存在している間繰り返す」というように、ファイルの有無で条件を決めたい場合は「test」コマンドと組み合わせます。
例えば、「mylockfileというファイルが存在している間」であれば「while test -f mylockfile; do コマンド; done」のように指定します(※2)。
※2 「test -f ファイル名」は、指定したファイルが存在し、そのファイルが通常ファイルだった場合に成功(真)となる。
testコマンドは、「[」記号と置き換えることが可能です。「[」を使った場合、「while [ -f mylockfile ]」のように、最後に「]」を必ず付けます。条件式として読みやすくなるため、シェルスクリプトではこの書き方が一般的でしょう。なお、「[」はあくまでもコマンドなので、オプションの前後には空白が必要です。「]」の前後にも空白を置きます。「while [-f mylockfile]」のように空白を入れずに書くと動作しません。
画面3では、「mylockfile」というファイルをまずtouchコマンド(第23回)で作ってから、whileコマンドを実行しています。whileコマンドでは、echoコマンド(第113回)とsleepコマンドを動かしています。「sleep 1」は1秒待機する、という意味なので、ファイルが存在するかどうか、1秒間隔でチェックしていることになります。
このようなwhileコマンドの使い方は、別のコマンドが作成したファイルを監視し、削除されるまで待つ場合に役立ちます。画面3では、他の端末画面でrmコマンド(第20回)を使ってmylockfileを削除しました。
while test -f mylockfile; do コマンド; done
(mylockfileが存在している間、コマンドを繰り返し実行する)
while [ -f mylockfile ]; do コマンド; done
(mylockfileが存在している間、コマンドを繰り返し実行する)
西村 めぐみ(にしむら めぐみ)
PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.