ループ処理 for, while
ループ処理 for, while とは
for文とwhile文を使った、繰り返し処理をターミナルで実践します。本レッスンでは、ループ処理 for, while の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ重要か
シェルスクリプトの威力が一気に増すのが「同じ処理を何度も繰り返す」場面です。100 個のファイルにリネームをかけたい、ログを 1 行ずつ走査したい、サーバーが起動するまで待ちたい。手作業では現実的に終わらないこういった処理は、for や while を使えば数行で書けます。逆にループを使いこなせないと、同じ行を 100 行コピペしたり、Python に頼らざるを得なくなったりして、生産性が大きく下がります。
for ループの基本
bash の for は「列挙したものを順に処理する」スタイルです。
ターミナル
#!/bin/bash
for name in alice bob carol; do
echo "Hello, $name"
doneプレーンテキスト
Hello, alice
Hello, bob
Hello, carolスペース区切りで列挙したリストを 1 つずつ変数に入れ、do ... done の間を繰り返します。for の後に変数名、in の後に列挙、done で閉じる、という形だけ覚えればいきなり使えます。
範囲を使った for
連番を回したいときは {開始..終了} 形式が便利です。
ターミナル
for i in {1..5}; do
echo "count $i"
doneC 言語風の書き方も使えます。
ターミナル
for ((i = 0; i < 5; i++)); do
echo "index $i"
doneファイル一覧を回す
ワイルドカードで展開した結果をそのまま for に渡せます。
ターミナル
for file in /tmp/*.log; do
echo "--- $file ---"
head -1 "$file"
doneファイル名に空白が含まれることもあるので、変数参照は必ずダブルクォートで囲みます。これを忘れると、空白で分割されて意図しないファイルを参照してしまうバグになります。
while ループの基本
while は条件が真の間繰り返します。
ターミナル
i=1
while [[ "$i" -le 3 ]]; do
echo "i = $i"
i=$((i + 1))
done$((...)) は算術評価で、i + 1 のような計算ができます。Python と違って bash の変数は基本的に文字列なので、計算するときは明示的にこの形を使います。
入力を 1 行ずつ読む while read
ファイルや標準入力を 1 行ずつ処理したいときは while read の組み合わせが王道です。
ターミナル
while read -r line; do
echo "got: $line"
done < /tmp/list.txt-r はバックスラッシュをエスケープ扱いしない安全オプションで、基本的に常に付ける癖を付けると良いです。< /tmp/list.txt で入力ファイルをリダイレクトしています。
ループ制御の流れ
break でループを抜け、continue で次の反復にスキップできます。
ターミナル
for i in {1..10}; do
if [[ $((i % 2)) -eq 0 ]]; then
continue
fi
if [[ "$i" -gt 7 ]]; then
break
fi
echo "$i"
done上の例は奇数だけ表示し、7 を超えたら抜ける、というロジックです。
until ループ
while の逆で、条件が偽の間繰り返すのが until です。「サーバーが起動するまで待つ」のような書き方に向きます。
ターミナル
until curl -s http://localhost:8080 > /dev/null; do
echo "waiting for server..."
sleep 1
done
echo "server is up"実用例 ログ集計
ターミナル
#!/bin/bash
total=0
while read -r line; do
size=$(echo "$line" | awk '{print $NF}')
total=$((total + size))
done < /tmp/access.log
echo "total bytes: $total"アクセスログのバイト数を合計するだけの単純な例ですが、while read + awk + 算術評価の典型的な組み合わせです。
ループの中で大量に外部コマンドを呼ぶと遅くなることがあります。awk 一発で済む処理なら、while で 1 行ずつ呼ばずに awk スクリプトに任せる方が高速です。bash で書くか awk/sed で書くかの境界を意識すると、シェルでも数万行のログを処理できるようになります。
無限ループと sleep
常駐ジョブを書くときは無限ループ + sleep が便利です。
ターミナル
while true; do
date
sleep 5
done本番運用では systemd の timer や cron に任せる方が安全ですが、デバッグや一時的なポーリングなら十分です。
本番環境で
while true; do ... doneを動かすときは「終了条件」と「停止方法」を明確にしておきます。trapで SIGTERM をハンドルしてグレースフルに止められるようにしておくと、運用での再起動が安全になります。
まとめ
for var in リスト; do ... doneで要素を 1 つずつ処理{1..N}や C 言語風の((...))で範囲を回せるwhile [[ 条件 ]]; do ... doneは条件が真の間繰り返すwhile read -r line; do ... done < fileで 1 行ずつ読むbreak,continueでループ制御untilは条件が偽の間繰り返し、起動待ちなどに便利
次のレッスン
次は 関数を定義する で、for文とwhile文を使った、繰り返し処理をターミナルで実践します を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- for と while の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. for と while とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
課題
- for ループを使う
- Number: 1, Number: 2, Number: 3 の順で出力する