Linuxのシェルスクリプトにおいて、「繰り返し処理」は非常に重要な構文の一つです。代表的なループ構文にはforやwhileがありますが、「条件が真になるまで処理を繰り返したい」といった場合にはuntilコマンドが適しています。
この記事では、untilコマンドの基本構文から具体的な使用例、whileとの違い、エラー回避のポイントまでを、初心者にも分かりやすく解説していきます。
untilコマンドとは?
untilは、指定した条件が「真」になるまで処理を繰り返すループ構文です。
言い換えれば、「条件が偽である間、繰り返す」動作になります。
until [ 条件 ]
do
実行する処理
done
この構文は、条件が**false(偽)**である間はdoブロック内の処理を繰り返し、**true(真)**になった時点でループを終了します。
基本的な使い方
以下は、iが5になるまで繰り返す簡単な例です。
#!/bin/bash
i=1
until [ $i -gt 5 ]
do
echo "現在の値: $i"
i=$((i + 1))
done
このスクリプトでは、iが6より大きくなるまで(つまり、iが1〜5の間)ループを繰り返します。
実行結果
現在の値: 1
現在の値: 2
現在の値: 3
現在の値: 4
現在の値: 5
このように、untilは「条件が偽の間」に繰り返す構文なので、whileとは逆の意味合いで使われます。
whileとの違いは?
untilとwhileの最大の違いは、「条件判定の方向」です。
while:条件が真の間にループuntil:条件が偽の間にループ
同じ処理をwhileで書くと、次のようになります。
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo "現在の値: $i"
i=$((i + 1))
done
どちらの構文も最終的に同じ結果になりますが、「繰り返しを終えるタイミング」の考え方が異なります。
実用的な使用例1:ファイルが作成されるまで待機する
ある処理で、指定したファイルが作成されるのを待ちたい場合があります。untilはこういった用途にぴったりです。
#!/bin/bash
filename="done.txt"
until [ -f "$filename" ]
do
echo "$filename がまだ存在しません。3秒後に再確認します。"
sleep 3
done
echo "$filename が見つかりました。処理を継続します。"
このスクリプトは、done.txtというファイルが作られるまで3秒ごとに確認し、見つかったら処理を続行します。
実用的な使用例2:インターネット接続を待つ
ネットワークが繋がるまで処理を待ちたいケースでもuntilが役立ちます。
#!/bin/bash
until ping -c 1 google.com > /dev/null 2>&1
do
echo "ネットワークが未接続です。再試行します..."
sleep 5
done
echo "ネットワークに接続されました。"
この例では、Googleにpingを飛ばし、応答があるまで5秒間隔で再試行しています。
無限ループに注意しよう
untilループでありがちなミスは、「条件が永遠に偽のまま」になってしまい、無限ループに陥るケースです。
たとえば、次のようにiを増やしていないとループが終わりません。
i=1
until [ $i -gt 5 ]
do
echo "無限ループに注意"
# i=$((i + 1)) ←これがないと終わらない!
done
ループの終了条件がきちんと変化しているか、事前に必ずチェックするようにしましょう。
複数条件を扱いたい場合
条件を複数指定する場合は、&&や||を使って論理演算を記述します。
例:ファイルが存在しない、かつ空でないことを確認する
until [ -f "data.txt" ] && [ -s "data.txt" ]
do
echo "data.txt が存在しないか、中身が空です。再確認します。"
sleep 2
done
echo "data.txt が存在し、かつ中身があります。"
このように、条件式を組み合わせることで、より柔軟なループ制御が可能になります。
untilを関数と組み合わせて使う
関数と組み合わせることで、再利用可能なループ処理が書けます。
wait_for_service() {
until systemctl is-active --quiet "$1"
do
echo "$1 サービスを待機中..."
sleep 2
done
echo "$1 サービスが起動しました。"
}
wait_for_service "nginx"
この関数は、指定されたサービス(ここではnginx)がアクティブになるまで待機する処理です。
まとめ
untilコマンドは、「ある条件が満たされるまで」繰り返し処理を行いたいときに非常に便利なループ構文です。whileとの違いに注意しながら、使い方をしっかり覚えることで、より柔軟で強力なシェルスクリプトが書けるようになります。
特に、ファイルの待機処理やネットワーク確認、サービスの起動待ちなど「待機系の処理」にはuntilが大活躍します。
ぜひ、あなたのシェルスクリプトにもuntilを取り入れて、スクリプトの完成度をさらに高めてください。
