untilコマンドで条件が真になるまでループ処理をする方法

Linuxのシェルスクリプトにおいて、「繰り返し処理」は非常に重要な構文の一つです。代表的なループ構文にはforwhileがありますが、「条件が真になるまで処理を繰り返したい」といった場合には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との違いは?

untilwhileの最大の違いは、「条件判定の方向」です。

  • 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を取り入れて、スクリプトの完成度をさらに高めてください。

タイトルとURLをコピーしました