【Bash講座 第9回】100回のコピペより1回のループ!「繰り返し処理」で手作業を撲滅せよ
こんにちは!「リナックス先生」です。
前回は、スクリプトに判断力を持たせる「条件分岐(if文)」を学びました。
コウ君、条件によって動きが変わるスクリプトは作れた?
先生!「ファイルがあったらバックアップする」スクリプト、便利に使ってます!
でも…バックアップしたいディレクトリが5つある場合、同じようなコードを5回コピペして書かないといけないんですか?
100個あったらどうしようって震えてます…。
その「コピペ地獄」から救い出してくれるのが、今回のテーマ「繰り返し処理(ループ)」よ。
「このリストにあるもの全部やっといて!」と命令するだけで、100個でも1万個でも文句ひとつ言わずに処理してくれるわ。
今回は、決められた回数をこなす「for文」と、条件が合う限り続ける「while文」をマスターしましょう!
第9回となる今回は、自動化スクリプトの華である「ループ処理」を解説します。
これを覚えれば、「全サーバーのログを回収する」「大量の画像をリサイズする」といった作業が一瞬で終わるようになり、定時退社の強力な味方になります。
本講座のカリキュラム(全12回)
AlmaLinux 9 (RHEL 9互換) 環境を前提に、基礎から応用までステップバイステップで進めます。
- Bash入門編:シェルとカーネルの関係、CUIの哲学、環境構築
- ファイル操作の極意:絶対パス・相対パスと「ワイルドカード」の魔術
- 権限(パーミッション)とユーザー:chmod, chown, sudoの仕組みを完全理解
- 入出力リダイレクトとパイプ:Linuxの真骨頂!コマンド同士を連携させる技術
- テキスト処理の基本:cat, head, tail, less…ファイルの中身を覗く道具たち
- 最強のエディタ「Vi/Vim」入門:サーバー内でテキストを編集する必須スキル
- シェルスクリプトの第一歩:ファイルにまとめて自動実行!変数と引数の基礎
- 条件分岐(if文):サーバーの状態を見て「判断」できるスクリプトを作る
- 【今回】繰り返し処理(for/while文):面倒な単純作業を1秒で終わらせるループ処理
- テキスト処理の応用:grep, sed, awk…ログ解析の達人になるための三種の神器
- 実践・自動化スクリプト:バックアップと監視を自動化し、Cronで定期実行する
- 総仕上げ:自作スクリプトの集大成と、エンジニアとしての歩き方
1. リストの数だけ繰り返す:「for文」の基本
Bashで最もよく使われるループが for 文です。
「これと、これと、これを処理して」とリストを渡すと、順番に取り出して処理してくれます。
基本構文
for 変数名 in リスト
do
# 繰り返したい処理
echo "$変数名"
done
do と done で囲まれた部分が、リストの数だけ繰り返されます。
リストの中身が順番に 変数名 に代入されていきます。
例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



コメント