本記事では、bashでwhile文によるループ処理を解説をします。
whileとは
whileはbashでの繰り返し処理を実現するための制御構文です。指定した条件が真である間、処理を繰り返し実行します。条件が偽になると、ループを終了して次の処理に移ります。繰り返し回数が不明な場合や、ファイルの終わりまで読み込むような処理に特に有用です。
構文
bashでのwhile文の基本構文は以下のようになります。
while [ 条件 ]
do
# 実行したい処理
done
または1行で書く場合
while [ 条件 ]; do 実行したい処理; done
例
基本的なカウントアップ処理
1から5までカウントアップし、各数値を表示します。count変数を使って条件をチェックし、ループのたびにインクリメントしています。
#!/bin/bash
count=1
while [ $count -le 5 ]
do
echo "カウント: $count"
count=$((count + 1))
done
ファイルの各行を読み込む
テキストファイル(sample.txt)の内容を1行ずつ読み込んで表示します。ログファイルの解析やCSVデータの処理などに役立ちます。
#!/bin/bash
while read line
do
echo "行の内容: $line"
done < sample.txt
無限ループとbreak文の使用
条件に「true」を指定して無限ループを作り、カウントが10に達したらbreak文でループを抜けます。
#!/bin/bash
count=1
while true
do
echo "実行回数: $count"
if [ $count -eq 10 ]; then
echo "ループを終了します"
break
fi
count=$((count + 1))
done
コマンドの実行結果をループ条件にする
pingコマンドの実行結果(終了ステータス)をループ条件として使用します。サーバーが応答している間はループを続行し、応答がなくなったら終了します。ネットワーク監視に便利です。
#!/bin/bash
while ping -c 1 example.com > /dev/null 2>&1
do
echo "サーバーは応答しています"
sleep 5
done
echo "サーバーが応答しなくなりました"
注意点
無限ループ
このコードは無限ループを使った処理を安全に行う例です。ファイルの存在をチェックして停止条件を設けています。
#!/bin/bash
# 無限ループの例と適切な脱出方法
while true
do
echo "プロセスを実行中..."
# 特定の条件で抜ける
if [ -f "stop_process.txt" ]; then
echo "停止ファイルを検出したため終了します"
break
fi
sleep 1
done
変数を更新し忘れ
変数を更新し忘れると、条件が変化せず無限ループになる可能性があります。
#!/bin/bash
# 変数更新忘れによる無限ループの例
count=1
while [ $count -le 5 ]
do
echo "現在のカウント: $count"
# 以下の行をコメントアウトすると無限ループになる
count=$((count + 1))
done
ファイル読み込みのリダイレクト位置
while文の中でファイルを読み込む場合、リダイレクト(<)の位置に注意しましょう。リダイレクトはwhileブロック全体に対して行います。
#!/bin/bash
# 正しいリダイレクトの例
while read line
do
echo "処理中: $line"
done < inputfile.txt
# 誤ったリダイレクトの例(これは動作しない)
# while read line < inputfile.txt
# do
# echo "処理中: $line"
# done
実行効率
複雑なループ処理ではシェルスクリプトの実行効率が下がる可能性があります。大量のデータ処理にはawk、sedなどの専用ツールの利用も検討しましょう。
#!/bin/bash
# 大量データの効率的な処理例
# bashのループで処理する例(遅い)
echo "Bashループによる処理開始..."
while read line
do
# 何らかの複雑な処理
echo "$line" | grep "pattern" > /dev/null
done < large_file.txt
# awkを使った効率的な処理例(速い)
echo "AWKによる処理開始..."
awk '/pattern/ { print $0 }' large_file.txt
まとめ
bashのwhile文は、条件が真である間、指定した処理を繰り返し実行する制御構文です。カウンターを用いた繰り返し、ファイルの読み込み、無限ループなど、様々な状況で活用できます。条件式や変数の更新に気をつければ、効率的な繰り返し処理を実装できるでしょう。