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