Bash Cheatsheet

Loops

Use this Bash reference while you build software engineering projects, review code for technical interview prep, or polish examples for a software engineer resume.

for Loop — List Iteration

for item in one two three; do
  echo "$item"
done

# Iterate over array
arr=(a b c)
for item in "${arr[@]}"; do
  echo "$item"
done

# Iterate over files (glob)
for f in *.txt; do
  echo "$f"
done

# Iterate over command output (word-split: ok for simple cases)
for word in $(cat file.txt); do
  echo "$word"
done

# Safer: iterate over lines with while read
while IFS= read -r line; do
  echo "$line"
done < file.txt

for Loop — C-style (Arithmetic)

for (( i=0; i<10; i++ )); do
  echo "$i"
done

# Reverse count
for (( i=10; i>0; i-- )); do
  echo "$i"
done

# Step by 2
for (( i=0; i<=20; i+=2 )); do
  echo "$i"
done

# Multiple variables
for (( i=0, j=10; i<10; i++, j-- )); do
  echo "$i $j"
done

Brace Expansion in Loops

for i in {1..10}; do echo "$i"; done        # 1 to 10
for i in {1..10..2}; do echo "$i"; done     # 1 3 5 7 9 (step 2, Bash 4+)
for i in {a..z}; do echo "$i"; done         # a to z
for i in {10..1}; do echo "$i"; done        # 10 down to 1

# seq alternative (more flexible)
for i in $(seq 1 5); do echo "$i"; done
for i in $(seq 0 2 10); do echo "$i"; done  # 0 2 4 6 8 10
for i in $(seq -w 1 10); do echo "$i"; done # zero-padded: 01 02 … 10

while Loop

while condition; do
  commands
done

# Count up
i=0
while (( i < 5 )); do
  echo "$i"
  (( i++ ))
done

# Read lines from a file
while IFS= read -r line; do
  echo "Line: $line"
done < file.txt

# Read from command output
while IFS= read -r line; do
  echo "$line"
done < <(find . -name "*.sh")    # process substitution

# Infinite loop
while true; do
  read -p "Continue? [y/n] " ans
  [[ $ans == n ]] && break
done

# While with multiple conditions
while [[ $a -lt 10 && $b -gt 0 ]]; do
  (( a++, b-- ))
done

until Loop

# Runs while condition is FALSE (opposite of while)
until condition; do
  commands
done

count=0
until (( count >= 5 )); do
  echo "$count"
  (( count++ ))
done

# Poll until a service is ready
until curl -s http://localhost:8080/health; do
  echo "waiting..."
  sleep 2
done

break and continue

# break — exit the loop
for i in {1..10}; do
  [[ $i -eq 5 ]] && break
  echo "$i"
done
# prints 1 2 3 4

# continue — skip current iteration
for i in {1..10}; do
  (( i % 2 == 0 )) && continue
  echo "$i"
done
# prints 1 3 5 7 9

# break / continue with level (nested loops)
for i in {1..3}; do
  for j in {1..3}; do
    [[ $j -eq 2 ]] && break 2   # break out of BOTH loops
    echo "$i $j"
  done
done

for i in {1..3}; do
  for j in {1..3}; do
    [[ $j -eq 2 ]] && continue 2  # continue outer loop
    echo "$i $j"
  done
done

Loop Control Patterns

# Loop over positional arguments
for arg in "$@"; do
  echo "Arg: $arg"
done

# shift to process arguments one by one
while [[ $# -gt 0 ]]; do
  echo "Processing: $1"
  shift
done

# Loop with index tracking
i=0
for item in "${arr[@]}"; do
  echo "[$i] $item"
  (( i++ ))
done

# Collect loop output into a variable
result=""
for f in *.txt; do
  result+="$f "
done
echo "$result"

# Loop in background (parallel)
for f in *.log; do
  process "$f" &
done
wait   # wait for all to finish

Reading Input in Loops

# Read lines from stdin
while IFS= read -r line; do
  echo "Got: $line"
done

# Read NUL-delimited input (safe for filenames with spaces/newlines)
while IFS= read -r -d '' file; do
  echo "File: $file"
done < <(find . -name "*.txt" -print0)

# Read CSV fields
while IFS=',' read -r name age city; do
  echo "Name=$name Age=$age City=$city"
done < data.csv

# Loop over lines with line number
lineno=0
while IFS= read -r line; do
  (( lineno++ ))
  echo "$lineno: $line"
done < file.txt

Loop Performance Tips

# Avoid spawning subshells in loops (slow)
# Bad:
while read -r line; do
  count=$(echo "$line" | wc -w)  # spawns two subshells
done < file

# Better: use builtins
while read -r line; do
  words=( $line )
  echo "${#words[@]}"
done < file

# Pipe into loop (runs in subshell — variable changes lost after)
cat file | while read -r line; do
  count=$line  # $count lost after loop
done
echo "$count"  # empty!

# Fix with process substitution
while IFS= read -r line; do
  count=$line
done < <(cat file)
echo "$count"  # works