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