Skip to content

Exploring the Until Loop in Bash

Dive deep into the world of Bash scripting by mastering the until loop, a powerful tool for efficient iteration. This guide provides you with real-world examples and use cases, ranging from basic loop structures to more complex conditions, tailored to enhance script control and automation. Discover how to leverage the until loop to execute commands until a specified condition is met, making your Bash scripts more effective and streamlined.


Until Loop

i=1
until ((i > 10)); do
    # Loop body
    echo $i
    ((i++))
done

Until Sample

COUNTER=20
until [  $COUNTER -lt 10 ]; do
    echo COUNTER $COUNTER
    let COUNTER-=1
done

Until Loop with Command Output

until grep -q "pattern" file.txt; do
    # Loop body
    echo "Pattern not found, retrying..."
    sleep 1
done

Until Loop with Function

function check_service_running() {
    # Function to check if a service is running
    ps aux | grep "service_name" | grep -q -v grep
}

until check_service_running; do
    # Loop body
    echo "Service not running, waiting..."
    sleep 5
done

Until Loop with Multiple Conditions

i=0
retries=3
until ((i >= retries)) || command_to_execute; do
    # Loop body
    echo "Executing command, attempt $((i+1))..."
    ((i++))
    sleep 2
done

Until host is up (ICMP ping)

#!/bin/bash

HOST="192.168.1.50"
until ping -c1 -W1 "$HOST" >/dev/null 2>&1; do
    echo "Waiting for $HOST to respond..."
    sleep 1
done
echo "$HOST is up."

Until host is up, then SSH into it

#!/bin/bash

HOST="192.168.1.50"
USER="root"

until nc -z "$HOST" 22 >/dev/null 2>&1; do
    echo "Waiting for SSH on $HOST..."
    sleep 1
done

echo "SSH is available. Connecting..."
exec ssh "$USER@$HOST"
Wait for ping

until ping -c1 host >/dev/null 2>&1; do sleep 1; done

Wait for SSH

until nc -z host 22; do sleep 1; done; ssh host
Wait until interface appears, then run tcpdump

#!/bin/bash

IFACE="vlan_mgmt"

until ifconfig "$IFACE" >/dev/null 2>&1; do
    echo "Waiting for interface $IFACE..."
    sleep 1
done

echo "$IFACE detected. Starting tcpdump..."
exec tcpdump -i "$IFACE" -vvv -ttttt -s0 -A

Wait until interface exists and is UP

#!/bin/bash

IFACE="vlan_mgmt"

until ip link show "$IFACE" 2>/dev/null | grep -q "state UP"; do
    echo "Waiting for $IFACE to be UP..."
    sleep 1
done

echo "$IFACE is UP. Starting tcpdump..."
exec tcpdump -i "$IFACE" -vvv -ttttt -s0 -A

Wait for interface to exist

until ifconfig vlan_mgmt >/dev/null 2>&1; do sleep 1; done; tcpdump -i vlan_mgmt -vvv -ttttt -s0 -A

Wait for interface to be UP

until ip link show vlan_mgmt 2>/dev/null | grep -q "state UP"; do sleep 1; done; tcpdump -i vlan_mgmt -vvv -ttttt -s0 -A

uto‑restart tcpdump if the interface disappears

!/bin/bash

IFACE="vlan_mgmt"

while true; do until ifconfig "$IFACE" >/dev/null 2>&1; do sleep 1 done

echo "$IFACE is up — starting tcpdump"
tcpdump -i "$IFACE" -vvv -ttttt -s0 -A

echo "tcpdump exited — waiting for $IFACE again"
sleep 1

done

Wait for interface + wait for IP address

!/bin/bash

IFACE="vlan_mgmt"

until ip -4 addr show "$IFACE" | grep -q "inet "; do sleep 1 done

echo "\(IFACE has an IP — starting tcpdump" exec tcpdump -i "\)IFACE" -vvv -ttttt -s0 -A