Доброго дня! В даній статті розглядається синтаксис циклів у командному інтерпретаторі Bash.

Цикл for

У Bash цикл for існує у двох варіантах. Перший з них подібний до стилю, який використовується в мові програмування С/С++:
for (( вираз1 ; вираз2 ; вираз3 )) ; do список_команд ; done
В даному випадку, спочатку розраховується арифметичне значення вираз1 у відповідності до правил розрахування арифметичних виразів. Після цього, циклічно розраховується значення арифметичного виразу вираз2, поки він не розрахується у нуль. Кожного разу, під час розрахування виразу вираз2 у не нульове значення, виконується список список_команд, після чого виконується вираз вираз3. Якщо будь-який вираз в охороні циклу відсутній — оболонка вважає, що він розраховується в значення 1. Повернене значення являється статусом виходу останньої виконаної команди з списку список_команд, або false, якщо будь-яке з виразів неправильне. Наступний варіант циклу for більш характерний для скриптових мов на подобі JavaScript, або циклів foreach:
for ім'я [ in слово ] ; do список_команд ; done
Список слів з “слово” розраховується до списку елементів. Значення змінної “ім'я” (апостроф використовувати не можна) встановлюється у значення кожного елементу списку і виконуються команди з списку список_команд. Якщо ключове слово in і “слово” не вказані, команда for, виконує список_команд для кожного з встановлених параметрів скрипта ($1 - ${N}). Статус повернення конструкції являється статусом повернення останньої виконаної команди. Якщо розрахування списку з “слово” результує у пустий список — жодна команда не виконується і статус повернення конструкції являється нульовим.

Цикл while і until

Цикли while i until у інтерпретаторі Bash мають наступний синтаксис:
while список; do список; done
until список; do список; done
Команда while продовжує виконувати команди вказані у списку команд “список” секції do, поки остання команда списку “список” секції while повертає нульовий статус. Цикл until ідентичний до команди while, окрім того, що команди з списку “do список” виконуються до того моменту, поки остання команда з списку “until список” поверне нульовий статус (тобто цикл виконується поки остання команда повертає ненульовий статус).

Приклади

Розглянемо приклад циклу for для аналізування переданих скрипту параметрів:
#!/bin/bash

# версія скрипта
version="1.0.0"
# якщо true - скрипт повинен вивести
# версію і вийти
show_only_v=
# ім'я користувача
username=

# визначаємо параметри циклом for
for param
do
  case $param in
  
    --show-version | -show-version)
      show_only_v=1 ;;
      
    --name=* | -name=*)
      # дана конструкція відсікає з параметра значення,
      # яке співпадає з шаблоном вказаним після символа "#"
      username=${param#*=} ;;
      
    *)
      # якщо вказано невідомий парамтр - виводимо спосіб використання
      # програми і завершуємо роботу скрипта
      echo -e "Використання: $0 [--name=Ваше ім'я] [--show-version]"
      exit 0
       
  esac
done

# якщо змінна show_only_v не пуста -
# виводимо на екран версію і завершуємо роботу скрипта
if [[ $show_only_v ]]
then
  echo "$0 v.$version"
  exit 0
fi

# якщо користувач ввів ім'я - виводимо привітання
if [[ $username ]]
then
  echo -e "Привіт, $username! Це програма, яка виводить привітання."
else
  # якщо не передано жодного параметра - 
  # виводимо спеціальне повідомлення
  echo "Не вказано жодного ім'я"    
fi
Даний скрипт призначення для відображення привітання користувачу, якщо введено ім'я за допомогою параметра “--name”, або версію за допомогою вказаного параметра --show-version. Вивід на екран терміналу може бути наступним (скрипт знаходиться у файлі for_parameters.sh): bash_circle_for_simple_example_for_script_parameters_analyse Розглянемо простий приклад з використанням циклу while:
#!/bin/bash

# оголошуємо цілочисельну змінну
declare -i cnt=0

# виводимо значення змінної в циклі
# і додаємо 1 до її значення
# поки не досягнемо значення 10
while [[ cnt -lt 10 ]]
do
  echo cnt: $cnt
  cnt+=1
done
Вивід скрипта на екран (скрипт знаходиться у файлі while.sh): bash_simple_script_output_for_circle_while