導入
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つです。
- 回数が決まっているカウンタ(上の例。ただし
forで書けるならそのほうが安全) - 条件が満たされるまで待つ(サービスが起動するまでリトライ、など)
- ファイルを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)) を忘れずに。