本文へスキップ
BecomeCoder

シェルスクリプトコース · 第5章 繰り返し · レッスン21

while ― 条件が続くあいだ繰り返す

ブラウザで完結

導入

for は「並べた分だけ」回りますが、while は「条件が成り立つあいだ」回り続けます。回数が決まっていない処理——リトライ、待機、1行ずつの読み込み——はこちらの担当です。

説明

while 条件; do 〜 done と書きます。条件の書き方は if とまったく同じです。

#!/bin/bash

i=1
while [ "$i" -le 5 ]; do
  echo "カウント: $i"
  i=$((i + 1))
done

echo "ループを抜けました"

while を書くときの鉄則は、ループの中で条件を変化させること。上の例では i=$((i + 1)) がそれです。これを書き忘れると条件が永遠に成り立ち、無限ループになります。

flowchart TD
    A["i=1"] --> B{"i <= 5 ?"}
    B -->|"はい"| C["中身を実行"]
    C --> D["i を1増やす"]
    D --> B
    B -->|"いいえ"| E["done(終了)"]

while の典型的な使いどころは3つです。

  1. 回数が決まっているカウンタ(上の例。ただし for で書けるならそのほうが安全)
  2. 条件が満たされるまで待つ(サービスが起動するまでリトライ、など)
  3. ファイルを1行ずつ読む(レッスン23で扱う、最頻出の形)

このコースのシミュレータには、暴走を止める安全装置が入っています。それでも無限ループを書くと処理が止まって見えるので、条件を変化させる行を必ず書く癖をつけてください。本物のサーバーでは、無限ループはCPUを食い潰します。

やってみよう

スクリプトを実行して 1〜5 が出ることを確かめましょう。次に -le 5-le 10 に変えて回数が増えること、さらに i=$((i + 1))i=$((i + 2)) に変えて 1・3・5 と飛ぶことを試してください。

演習

while で 1 から 3 までを数えて、最後に カウント: 3 と表示されるようにしてください。

ヒント1を見る

i=1 から始めて、条件は [ "$i" -le 3 ] です。

ヒント2を見る

ループの中で i=$((i + 1)) を忘れずに。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

シェルスクリプト(シミュレート)

スクリプトを書くエディタと、それを動かす仮想シェルを読み込みます(本物のbashではなく、動きを再現した学習用の環境です)。
スクロールして表示された時点でも自動で読み込まれます。