Skip to content

Loops

Bash loops are essential for automating repetitive tasks, processing collections of data, and implementing conditional iteration. This section covers for, while, and until loops, along with their use cases for arrays, ranges, and dynamic conditions.


for Loop: Iterating Over Collections

The for loop is ideal for iterating over arrays, ranges, or lists of items.

Basic Syntax

for item in {list}; do
  commands
done
For example, looping through a list of files:
for file in /var/log/*.log; do
  echo "Processing $file"
done

Iterating Over Arrays

servers=("host1" "host2" "host3")
for server in "${servers[@]}"; do
  ssh $server "uptime"
done

Ranges with seq or {start..end}

for i in {1..5}; do
  echo "Number: $i"
done
Or using seq:
for i in $(seq 1 2 10); do
  echo "Even number: $i"
done

Note: The C-style for loop (e.g., for ((i=0; i<5; i++))) is available in Bash 4.0+ but less common for simple iteration.


while Loop: Condition-Based Iteration

The while loop executes commands as long as a condition is true.

Basic Syntax

while condition; do
  commands
done
Example: Processing input until a sentinel value is found:
read -p "Enter a number (0 to exit): " num
while [ "$num" -ne 0 ]; do
  echo "You entered: $num"
  read -p "Enter a number (0 to exit): " num
done

Reading Lines from a File

while IFS= read -r line; do
  echo "Line: $line"
done < /path/to/file.txt

Caution: Always ensure the condition will eventually become false to avoid infinite loops.


until Loop: Inverse of while

The until loop runs commands until a condition is met.

Basic Syntax

until condition; do
  commands
done
Example: Waiting for a service to start:
until curl -s --head http://localhost:8080 | grep "200 OK" > /dev/null; do
  echo "Waiting for service..."
  sleep 5
done

This is useful for retry logic or polling scenarios.


Advanced Use Cases

  • Combining Loops with Arrays/Ranges:
    for i in {1..3}; do
      for j in {a..c}; do
        echo "($i, $j)"
      done
    done
    
  • Looping Over Directory Contents:
    for dir in /etc/*; do
      [ -d "$dir" ] && echo "Directory: $dir"
    done
    

Key takeaways

  • Use for for iterating over arrays, ranges, or static lists.
  • Use while for dynamic conditions that depend on external input or state.
  • Use until for retry logic or waiting for a specific condition.
  • Always test loops with set -x to debug unexpected behavior.
  • Prefer for over while for simple collection iteration unless conditions are required.