ループ処理 for, while

ループ処理 for, while とは

for文とwhile文を使った、繰り返し処理をターミナルで実践します。本レッスンでは、ループ処理 for, while の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

シェルスクリプトの威力が一気に増すのが「同じ処理を何度も繰り返す」場面です。100 個のファイルにリネームをかけたい、ログを 1 行ずつ走査したい、サーバーが起動するまで待ちたい。手作業では現実的に終わらないこういった処理は、forwhile を使えば数行で書けます。逆にループを使いこなせないと、同じ行を 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" done

C 言語風の書き方も使えます。

ターミナル

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 で入力ファイルをリダイレクトしています。

ループ制御の流れ

diagram (will load when visible)

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 つができることを確認しましょう。

  1. for と while の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. for と while とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

課題

  1. for ループを使う
  2. Number: 1, Number: 2, Number: 3 の順で出力する

ヒント

script.sh
script.sh
学習モード
script.sh
ターミナル出力