while コマンド

条件が真である限り、コマンドを繰り返し実行します。

概要

while コマンドはシェルの構文で、指定された条件が真と評価される限り、一連のコマンドを繰り返し実行するループを作成します。固定回数の繰り返し、入力を1行ずつ処理する、または特定の条件が変わるまでコマンドを実行するなどの用途によく使われます。

オプション

while コマンドは独立したプログラムではなくシェル組み込みの構文であるため、従来のコマンドラインオプションはありません。

使用例

基本的な while ループ

$ i=1
$ while [ $i -le 5 ]; do
>   echo "Count: $i"
>   i=$((i+1))
> done
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5

ファイルを1行ずつ読み込む

$ while read line; do
>   echo "Line: $line"
> done < file.txt
Line: This is the first line
Line: This is the second line
Line: This is the third line

break 条件付きの無限ループ

$ while true; do
>   echo "Enter a number (0 to exit):"
>   read num
>   if [ "$num" -eq 0 ]; then
>     break
>   fi
>   echo "You entered: $num"
> done
Enter a number (0 to exit):
5
You entered: 5
Enter a number (0 to exit):
0

コマンド出力の処理

$ ls -1 *.txt | while read file; do
>   echo "Processing $file"
>   wc -l "$file"
> done
Processing document.txt
      10 document.txt
Processing notes.txt
       5 notes.txt

ヒント:

Control-C で無限ループを終了する

無限ループ(while true; do...など)を作成し、終了する必要がある場合は、Control-C を押してループを終了します。

ポーリングのために sleep と組み合わせる

whilesleep コマンドと一緒に使用して、定期的に条件をチェックします:

$ while ! ping -c 1 server.example.com &>/dev/null; do
>   echo "Server not reachable, waiting..."
>   sleep 5
> done

一般的な落とし穴を避ける

決して偽にならない可能性のある条件には注意してください。無限ループが発生する可能性があります。常に条件が最終的に偽と評価される方法があることを確認してください。

continue を使用して反復をスキップする

continue ステートメントは while ループ内で使用して、現在の反復の残りをスキップし、次の反復に移動することができます。

よくある質問

Q1. whileuntil の違いは何ですか?

A. while は条件が真である限りコマンドを実行しますが、until は条件が偽である限りコマンドを実行します。

Q2. while を使って標準入力から読み込むことはできますか?

A. はい、リダイレクションなしで while read line; do ...; done を使用すると、標準入力から読み込みます。

Q3. while でカウントダウンタイマーを作るにはどうすればよいですか?

A. 減少するカウンターを使用します:count=10; while [ $count -gt 0 ]; do echo $count; count=$((count-1)); sleep 1; done; echo "Done!"

Q4. 各反復で複数の値を処理するにはどうすればよいですか?

A. read コマンドで複数の変数を使用します:while read name age; do echo "$name is $age years old"; done < data.txt

参考文献

https://www.gnu.org/software/bash/manual/html_node/Looping-Constructs.html

改訂履歴