Woman checking her email in a meeting
Linuxのシェルスクリプトにおいて、「繰り返し処理」は非常に重要な構文の一つです。代表的なループ構文にはfor
やwhile
がありますが、「条件が真になるまで処理を繰り返したい」といった場合にはuntil
コマンドが適しています。
この記事では、until
コマンドの基本構文から具体的な使用例、while
との違い、エラー回避のポイントまでを、初心者にも分かりやすく解説していきます。
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
とは逆の意味合いで使われます。
until
とwhile
の最大の違いは、「条件判定の方向」です。
while
:条件が真の間にループuntil
:条件が偽の間にループ同じ処理をwhile
で書くと、次のようになります。
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo "現在の値: $i"
i=$((i + 1))
done
どちらの構文も最終的に同じ結果になりますが、「繰り返しを終えるタイミング」の考え方が異なります。
ある処理で、指定したファイルが作成されるのを待ちたい場合があります。until
はこういった用途にぴったりです。
#!/bin/bash
filename="done.txt"
until [ -f "$filename" ]
do
echo "$filename がまだ存在しません。3秒後に再確認します。"
sleep 3
done
echo "$filename が見つかりました。処理を継続します。"
このスクリプトは、done.txt
というファイルが作られるまで3秒ごとに確認し、見つかったら処理を続行します。
ネットワークが繋がるまで処理を待ちたいケースでも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 が存在し、かつ中身があります。"
このように、条件式を組み合わせることで、より柔軟なループ制御が可能になります。
関数と組み合わせることで、再利用可能なループ処理が書けます。
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
を取り入れて、スクリプトの完成度をさらに高めてください。