【Bash講座 第9回】単純作業はループで解決!for文とwhile文による繰り返し処理の極意

【Bash講座 第9回】100回のコピペより1回のループ!「繰り返し処理」で手作業を撲滅せよ

こんにちは!「リナックス先生」です。
前回は、スクリプトに判断力を持たせる「条件分岐(if文)」を学びました。
コウ君、条件によって動きが変わるスクリプトは作れた?

コウ君

先生!「ファイルがあったらバックアップする」スクリプト、便利に使ってます!
でも…バックアップしたいディレクトリが5つある場合、同じようなコードを5回コピペして書かないといけないんですか?
100個あったらどうしようって震えてます…。

リナックス先生

その「コピペ地獄」から救い出してくれるのが、今回のテーマ「繰り返し処理(ループ)」よ。
「このリストにあるもの全部やっといて!」と命令するだけで、100個でも1万個でも文句ひとつ言わずに処理してくれるわ。
今回は、決められた回数をこなす「for文」と、条件が合う限り続ける「while文」をマスターしましょう!

第9回となる今回は、自動化スクリプトの華である「ループ処理」を解説します。
これを覚えれば、「全サーバーのログを回収する」「大量の画像をリサイズする」といった作業が一瞬で終わるようになり、定時退社の強力な味方になります。

本講座のカリキュラム(全12回)

AlmaLinux 9 (RHEL 9互換) 環境を前提に、基礎から応用までステップバイステップで進めます。

  1. Bash入門編:シェルとカーネルの関係、CUIの哲学、環境構築
  2. ファイル操作の極意:絶対パス・相対パスと「ワイルドカード」の魔術
  3. 権限(パーミッション)とユーザー:chmod, chown, sudoの仕組みを完全理解
  4. 入出力リダイレクトとパイプ:Linuxの真骨頂!コマンド同士を連携させる技術
  5. テキスト処理の基本:cat, head, tail, less…ファイルの中身を覗く道具たち
  6. 最強のエディタ「Vi/Vim」入門:サーバー内でテキストを編集する必須スキル
  7. シェルスクリプトの第一歩:ファイルにまとめて自動実行!変数と引数の基礎
  8. 条件分岐(if文):サーバーの状態を見て「判断」できるスクリプトを作る
  9. 【今回】繰り返し処理(for/while文):面倒な単純作業を1秒で終わらせるループ処理
  10. テキスト処理の応用:grep, sed, awk…ログ解析の達人になるための三種の神器
  11. 実践・自動化スクリプト:バックアップと監視を自動化し、Cronで定期実行する
  12. 総仕上げ:自作スクリプトの集大成と、エンジニアとしての歩き方

1. リストの数だけ繰り返す:「for文」の基本

Bashで最もよく使われるループが for 文です。
「これと、これと、これを処理して」とリストを渡すと、順番に取り出して処理してくれます。

基本構文

for 変数名 in リスト
do
    # 繰り返したい処理
    echo "$変数名"
done

dodone で囲まれた部分が、リストの数だけ繰り返されます。
リストの中身が順番に 変数名 に代入されていきます。

例1:名指しでループする

for_names.sh を作成して試してみましょう。

#!/bin/bash

# スペース区切りでリストを渡す
for NAME in Alice Bob Charlie
do
    echo "こんにちは、$NAME さん!"
done

実行結果:

[root@localhost ~]# ./for_names.sh
こんにちは、Alice さん!
こんにちは、Bob さん!
こんにちは、Charlie さん!

2. ファイルの一括処理:「ワイルドカード」との合わせ技

for 文が真価を発揮するのは、第2回で学んだ「ワイルドカード(*)」と組み合わせた時です。
「ディレクトリ内の .log ファイル全て」といった指定が簡単にできます。

例2:ログファイルを一括バックアップ

カレントディレクトリにある全ての .log ファイルを、.log.bak にリネーム(名前変更)するスクリプトです。

#!/bin/bash

# *.log にマッチするファイル名が順番に FILE に入る
for FILE in *.log
do
    echo "$FILE をバックアップします..."
    cp "$FILE" "${FILE}.bak"
done

echo "全ての処理が完了しました。"
コウ君

これです! これがやりたかったんです!
ファイルが100個あっても、この数行だけで全部処理してくれるんですね。感動!

3. 回数を指定して繰り返す:数値のループ

「1から10まで数字を表示したい」といった場合は、ブレース展開 {1..10} を使うのがスマートです。

例3:連番のディレクトリを作成

#!/bin/bash

# 1から5まで繰り返す
for i in {1..5}
do
    DIR_NAME="project_v$i"
    echo "ディレクトリ作成: $DIR_NAME"
    mkdir -p "$DIR_NAME"
done

💡 seq コマンドを使う方法もある

古いシェルや互換性を気にする場合は、seq コマンドを使って for i in $(seq 1 5) と書くこともあります。
でも、最新のBashなら {1..5} の方が書くのも楽で、処理も高速です。

4. 条件が満たされる限り続く:「while文」

for 文が決まった回数だけ繰り返すのに対し、whileは「条件式が成功(真)である限り」無限に繰り返します。

基本構文

while [ 条件式 ]
do
    # 繰り返したい処理
done

例4:カウントダウンタイマー

変数 COUNT が0より大きい間、ループし続けます。

#!/bin/bash

COUNT=3

# COUNTが0より大きい(-gt 0)ならループ
while [ $COUNT -gt 0 ]
do
    echo "あと $COUNT 秒..."
    sleep 1          # 1秒待つ
    COUNT=$((COUNT-1))  # 変数を1減らす(算術演算)
done

echo "発射!"
リナックス先生

$(( 計算式 )) という書き方は、Bashで計算をする時の決まり文句よ。
これを使わないと、ただの文字列として扱われちゃうから注意してね。

5. サーバー監視の鉄板:「無限ループ」

while 文の条件式に、常に成功するコマンド(true:)を書くと、永遠に終わらない「無限ループ」が作れます。
これはサーバーの監視スクリプトなどで非常によく使われます。

例5:5秒ごとに生存確認(Ping)

終わらせる時は、キーボードの Ctrl + C を押して強制停止します。

#!/bin/bash

TARGET="8.8.8.8"  # GoogleのDNSサーバー

# : (コロン) は「何もしない」というコマンドで、常に成功(0)を返す
while :
do
    # pingを1回だけ打つ
    if ping -c 1 "$TARGET" > /dev/null; then
        echo "[OK] $(date) : $TARGET は生きています"
    else
        echo "[NG] $(date) : $TARGET から応答がありません!"
        # ここでメール送信コマンドなどを書けば監視システムになる
    fi

    sleep 5  # 5秒待機
done

6. ループの制御:break と continue

ループの途中で「もう終わり!」と抜け出したり、「今回はスキップ!」と飛ばしたりする命令です。

  • break : ループを完全に脱出する(終了する)
  • continue : 今回の処理をスキップして、次のループへ進む

例6:特定ファイルだけスキップする

#!/bin/bash

for FILE in *
do
    # "secret.txt" ならスキップ
    if [ "$FILE" = "secret.txt" ]; then
        echo "$FILE は秘密なのでスキップします。"
        continue
    fi

    echo "$FILE を処理中..."
done

7. 実践:複数サーバーの生存確認スクリプト

ここまでの知識(for文、変数、if文、コマンド実行)を総動員して、実用的なツールを作ってみましょう。
「サーバーリスト(IPアドレス)」を読み込んで、順番にPingを打つスクリプトです。

まず、リストファイル servers.txt を作ります。

8.8.8.8
1.1.1.1
192.168.0.1

次に、スクリプト check_all.sh を作ります。

#!/bin/bash

SERVER_LIST="servers.txt"

# ファイルがあるか確認
if [ ! -f "$SERVER_LIST" ]; then
    echo "エラー: $SERVER_LIST が見つかりません。"
    exit 1
fi

# catコマンドの結果をループで回す
for IP in $(cat "$SERVER_LIST")
do
    echo "--------------------------------"
    echo "Check: $IP"
    
    if ping -c 1 -W 1 "$IP" > /dev/null; then
        echo "結果: OK"
    else
        echo "結果: NG (応答なし)"
    fi
done
コウ君

すごい…! まるで本物の監視ツールみたいです!
リストファイルを書き換えるだけで、チェック対象をいくらでも増やせるのが便利すぎます!

次回予告:テキスト処理の三種の神器

第9回は、自動化の要である「ループ処理」について解説しました。
for でリストを回し、while で監視する。この2つがあれば、大抵のルーチンワークは自動化できます。

次回は、Linux操作において「最強」の呼び声高いテキスト処理ツール群、「grep」「sed」「awk」について解説します。
「ログファイルからエラー行だけを抜き出す」「IPアドレスの部分だけを置換する」といった高度なデータ加工が、コマンド1行でできるようになります。
これをマスターすれば、あなたはもう「シェル芸人」の仲間入りです。

リナックス先生

次回までに、今回の for 文を使って
「カレントディレクトリにある全てのファイルを、old_ファイル名 にリネームするスクリプト」
を作ってみてね。変数の展開 ${FILE} をうまく使うのがコツよ!

▼スクリプトの実験場に最適!推奨VPS

【2026年最新】Linuxサーバー構築におすすめのVPS比較3選!現役エンジニアが速度とコスパで厳選
Linuxの勉強、まだ「自分のPC」でやって消耗していませんか?「Linuxを覚えたいけど、環境構築でエラーが出て先に進めない…」「VirtualBoxを入れたらパソコンが重くなった…」これは、Linux学習を始める9割の人がぶつかる壁です...

コメント