導入
「見つかったらそこで終わりにしたい」「この条件のときだけ処理を飛ばしたい」。ループを最後まで律儀に回す必要はありません。break と continue で、流れを自分でコントロールします。
説明
break… ループをその場で抜けるcontinue… 残りの処理を飛ばして、次の周回へ進む
#!/bin/bash
echo "=== continue: 2 だけ飛ばす ==="
for i in 1 2 3 4; do
if [ "$i" -eq 2 ]; then
continue
fi
echo "処理: $i"
done
echo "=== break: 3 で打ち切る ==="
for i in 1 2 3 4; do
if [ "$i" -eq 3 ]; then
echo "3 を見つけたので終了"
break
fi
echo "確認: $i"
done
flowchart TD
A["ループの先頭"] --> B["処理"]
B --> C{"continue の条件?"}
C -->|"はい"| A
C -->|"いいえ"| D{"break の条件?"}
D -->|"はい"| E["ループを抜ける"]
D -->|"いいえ"| F["残りの処理"]
F --> A
break の代表的な使いどころは 「探して、見つけたら止める」 です。1000件のログから最初のエラーを見つけたら、残り999件を見る必要はありません。
until という構文もあります。while の逆で、条件が成り立つまで繰り返します。
until [ -f done.flag ]; do
echo "完了を待っています"
break
done
while [ ! 条件 ] と until [ 条件 ] は同じ意味です。読んで自然なほうを選べば構いません。
やってみよう
スクリプトを実行して、continue では 2 だけが飛ばされること、break では 3 以降がまったく処理されないことを見比べましょう。次に break を continue に書き換えて実行すると、4 まで処理が続くことが分かります。この違いが、そのまま2つの役割の違いです。
演習
for i in 1 2 3 4 5 のループで、i が 4 になったら break で打ち切り、打ち切りました と表示してください。
ヒント1を見る
if [ "$i" -eq 4 ]; then の中で echo してから break します。
ヒント2を見る
if [ "$i" -eq 4 ]; then echo "打ち切りました"; break; fi