Bash — Loops

If you like this project, consider supporting me on Buy Me a Coffee ☕️

🔄 FOR Loops / Циклы FOR

Over Files / Перебор файлов

for f in *.log; do echo "$f"; done             # Iterate .log files / Перебрать .log файлы
for f in *.{yml,yaml}; do echo "$f"; done      # Multiple extensions / Несколько расширений
for f in /var/log/*.log; do : > "$f"; done     # Truncate all logs / Очистить все логи
for f in $(find . -name "*.txt"); do echo "$f"; done  # With find / С find
for f in *.conf; do cp "$f" "$f.bak"; done     # Backup all configs / Бэкап всех конфигов

Over Numbers / Перебор чисел

for i in {1..5}; do echo $i; done              # Range 1-5 / Диапазон 1-5
for i in {1..10..2}; do echo $i; done          # Step by 2 / Шаг 2
for i in {10..1}; do echo $i; done             # Reverse / Обратный порядок
for ((i=1; i<=5; i++)); do echo $i; done       # C-style loop / Цикл в стиле C
for ((i=0; i<10; i+=2)); do echo $i; done      # C-style with step / С шагом

Over Arrays / Перебор массивов

arr=("apple" "banana" "cherry")
for item in "${arr[@]}"; do echo "$item"; done # Iterate array / Перебрать массив
for i in "${!arr[@]}"; do echo "$i: ${arr[$i]}"; done  # With indices / С индексами

Over Command Output / По выводу команды

for user in $(cut -d: -f1 /etc/passwd); do echo "$user"; done  # All users / Все пользователи
for ip in $(cat ips.txt); do ping -c1 "$ip"; done  # Ping all IPs / Пинговать все IP
for pod in $(kubectl get pods -o name); do kubectl describe "$pod"; done  # K8s pods / Поды Kubernetes

⏳ WHILE Loops / Циклы WHILE

Basic While / Базовый while

i=1
while [ $i -le 5 ]; do
  echo $i
  ((i++))
done                                           # Counter 1-5 / Счётчик 1-5

Read from File / Чтение из файла

while read -r line; do
  echo "$line"
done < file.txt                                # Read file lines / Читать построчно

Infinite Loops / Бесконечные циклы

while :; do
  date
  sleep 5
done                                           # Tick every 5s / Каждые 5 секунд
while true; do
  echo "Running..."
  sleep 10
done                                           # Alternative infinite / Альтернативный бесконечный

Conditional While / Условный while

while pgrep -x "nginx" > /dev/null; do
  echo "Nginx running"
  sleep 5
done                                           # While process exists / Пока процесс существует
while ! ping -c1 8.8.8.8 &>/dev/null; do
  echo "Waiting for network..."
  sleep 2
done                                           # Wait for network / Ждать сети

🔁 UNTIL Loops / Циклы UNTIL

Basic Until / Базовый until

i=1
until [ $i -gt 5 ]; do
  echo $i
  ((i++))
done                                           # Run until condition true / Пока условие ЛОЖНО

Wait for Condition / Ожидание условия

until curl -sf http://localhost:8080/health > /dev/null; do
  echo "Waiting for service..."
  sleep 2
done                                           # Wait for service / Ждать сервис
until [ -f /tmp/ready ]; do
  echo "Waiting for file..."
  sleep 1
done                                           # Wait for file / Ждать файл

🎮 Loop Control / Управление циклами

Break / Прерывание

for i in {1..10}; do
  if [ $i -eq 5 ]; then
    break
  fi
  echo $i
done                                           # Exit loop at 5 / Выход на 5

Continue / Продолжение

for i in {1..10}; do
  if [ $((i % 2)) -eq 0 ]; then
    continue
  fi
  echo $i
done                                           # Skip even numbers / Пропустить чётные

Nested Loops / Вложенные циклы

for i in {1..3}; do
  for j in {1..3}; do
    echo "$i,$j"
  done
done                                           # Nested iteration / Вложенный перебор

📖 Reading Files / Чтение файлов

Read Lines / Чтение строк

while IFS= read -r line; do
  echo "$line"
done < file.txt                                # Preserve whitespace / Сохранить пробелы

Read CSV / Чтение CSV

while IFS=',' read -r col1 col2 col3; do
  echo "Col1: $col1, Col2: $col2"
done < data.csv                                # Parse CSV / Парсить CSV

Process Substitution / Подстановка процесса

while IFS= read -r f; do
  echo "$f"
done < <(ls -1)                                # No subshell variable loss / Без потери переменных

Read with Timeout / Чтение с таймаутом

while read -t 5 -r line; do
  echo "$line"
done < <(some_command)                         # 5s timeout / Таймаут 5с

🌟 Real-World Examples / Примеры из практики

System Administration / Системное администрирование

# Rotate logs / Ротация логов
for log in /var/log/app/*.log; do
  mv "$log" "$log.old"
  touch "$log"
done
# Monitor services / Мониторинг сервисов
while :; do
  if ! systemctl is-active --quiet nginx; then
    echo "Nginx down, restarting..."
    systemctl restart nginx
  fi
  sleep 60
done
# Cleanup old files / Очистка старых файлов
for f in $(find /tmp -name "*.tmp" -mtime +7); do
  echo "Deleting $f"
  rm "$f"
done

Network Operations / Сетевые операции

# Ping sweep / Проверка сети
for i in {1..254}; do
  {
    ip="192.168.1.$i"
    ping -c1 -W1 "$ip" &>/dev/null && echo "$ip is up"
  } &
done
wait
# Port scan / Сканирование портов
for port in {20..30}; do
  timeout 1 bash -c "echo > /dev/tcp/<HOST>/$port" 2>/dev/null && echo "Port $port open"
done
# Check URLs / Проверка URL
while IFS= read -r url; do
  status=$(curl -o /dev/null -s -w "%{http_code}" "$url")
  echo "$url: $status"
done < urls.txt

File Processing / Обработка файлов

# Batch rename / Пакетное переименование
for f in *.jpeg; do
  mv "$f" "${f%.jpeg}.jpg"
done
# Convert images / Конвертация изображений
for img in *.png; do
  convert "$img" "${img%.png}.webp"
done
# Extract archives / Распаковка архивов
for archive in *.tar.gz; do
  tar -xzf "$archive" -C /dest/
done

Database Operations / Операции с БД

# Backup all databases / Бэкап всех БД
for db in $(mysql -Ne "SHOW DATABASES" | grep -v "information_schema\|performance_schema\|mysql"); do
  mysqldump "$db" | gzip > "/backup/${db}-$(date +%Y%m%d).sql.gz"
done
# Check DB connections / Проверка подключений к БД
while IFS= read -r host; do
  mysql -h "$host" -e "SELECT 1" &>/dev/null && echo "$host: OK" || echo "$host: FAIL"
done < db_hosts.txt

Kubernetes / Docker

[!CAUTION] Deleting pods and containers is destructive. Make sure you are targeting the correct namespace/resources. Удаление подов и контейнеров — деструктивная операция. Убедитесь, что вы работаете с нужным namespace/ресурсами.

# Restart all pods / Перезапуск всех подов
for pod in $(kubectl get pods -o name -n <NAMESPACE>); do
  kubectl delete "$pod" -n <NAMESPACE>
done
# Cleanup old containers / Очистка старых контейнеров
for container in $(docker ps -aq); do
  docker rm -f "$container"
done
# Check pod status / Проверка статуса подов
while :; do
  kubectl get pods -o wide
  sleep 10
done

Parallel Processing / Параллельная обработка

# Process files in parallel / Обработка файлов параллельно
for f in *.log; do
  {
    gzip "$f"
    echo "$f compressed"
  } &
done
wait                                           # Wait for all background jobs / Ждать все фоновые задачи
# Limited parallelism / Ограниченный параллелизм
max_jobs=4
for f in *.txt; do
  while [ $(jobs -r | wc -l) -ge $max_jobs ]; do
    sleep 0.1
  done
  {
    process_file "$f"
  } &
done
wait

Monitoring & Alerting / Мониторинг и оповещения

# Watch disk space / Мониторинг дискового пространства
while :; do
  usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
  if [ "$usage" -gt 90 ]; then
    echo "Disk usage critical: ${usage}%"
  fi
  sleep 300
done
# Monitor log for errors / Мониторинг логов на ошибки
tail -f /var/log/app.log | while read -r line; do
  if echo "$line" | grep -q "ERROR"; then
    echo "Error detected: $line"
  fi
done

Advanced Patterns / Продвинутые шаблоны

# Counter with timeout / Счётчик с таймаутом
timeout=10
counter=0
while [ $counter -lt $timeout ]; do
  if check_condition; then
    echo "Success!"
    break
  fi
  ((counter++))
  sleep 1
done
# Retry logic / Логика повтора
max_retries=3
retry=0
until some_command || [ $retry -eq $max_retries ]; do
  ((retry++))
  echo "Retry $retry/$max_retries..."
  sleep 5
done
# Interactive menu / Интерактивное меню
options=("Start" "Stop" "Restart" "Exit")
while :; do
  for i in "${!options[@]}"; do
    echo "$((i+1)). ${options[$i]}"
  done
  read -p "Select option: " choice
  case $choice in
    4) break ;;
    *) echo "Processing ${options[$((choice-1))]}" ;;
  esac
done

On this page

🔄 FOR Loops / Циклы FOR Over Files / Перебор файлов Over Numbers / Перебор чисел Over Arrays / Перебор массивов Over Command Output / По выводу команды ⏳ WHILE Loops / Циклы WHILE Basic While / Базовый while Read from File / Чтение из файла Infinite Loops / Бесконечные циклы Conditional While / Условный while 🔁 UNTIL Loops / Циклы UNTIL Basic Until / Базовый until Wait for Condition / Ожидание условия 🎮 Loop Control / Управление циклами Break / Прерывание Continue / Продолжение Nested Loops / Вложенные циклы 📖 Reading Files / Чтение файлов Read Lines / Чтение строк Read CSV / Чтение CSV Process Substitution / Подстановка процесса Read with Timeout / Чтение с таймаутом 🌟 Real-World Examples / Примеры из практики System Administration / Системное администрирование Network Operations / Сетевые операции File Processing / Обработка файлов Database Operations / Операции с БД Kubernetes / Docker Parallel Processing / Параллельная обработка Monitoring &amp; Alerting / Мониторинг и оповещения Advanced Patterns / Продвинутые шаблоны