連載
» 2018年06月28日 05時00分 公開

Linux基本コマンドTips(219):【 while 】コマンド――繰り返し処理を行う

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、同じ処理を繰り返し実行する「while」コマンドです。

[西村めぐみ,@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は同じ処理を繰り返し実行する「while」コマンドです。

whileコマンドとは?

 「while」は、何かの条件を指定して、繰り返し処理を行う際に使うbashの内部コマンドです。「指定したコマンドの実行結果が成功している間」のように条件を指定します。

 whileコマンドは主にシェルスクリプト内で使用します。コマンドラインでも、[CTRL]+[C]で中断するまで、同じコマンドを繰り返し実行したい場合などに役立ちます。



whileコマンドの書式

while コマンド; do コマンド; done

while [ 式 ]; do コマンド; done

※[ ]は省略可能な引数を示しています





whileの主なオプション

 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コマンドを実行しています。

画面1 画面1 whileコマンドを使って複数のコマンドを繰り返し実行したところ

 なお、「watch」コマンド(第220回)を使って、画面1の処理を書き直すこともできます(画面2)。watchコマンドは、指定した間隔でコマンドを実行します。whileコマンドとは実行結果の表示方法が異なり、フルスクリーンで表示して、常に最新の結果だけが残ります。[CTRL]+[C]で終了します。

画面2 画面2 「watch -n 1 date」を実行したところ(参考)


ファイルが存在している間繰り返す

 「ファイルが存在している間繰り返す」というように、ファイルの有無で条件を決めたい場合は「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が存在している間、コマンドを繰り返し実行する)


画面3 画面3 ファイルが存在する間、繰り返し処理を実行したところ


筆者紹介

西村 めぐみ(にしむら めぐみ)

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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。