Среди прочих язык shell содержит следующие управляющие конструкции.
Оператор цикла for:
for имя [in слово ...] do список done
При каждой итерации переменная имя принимает следующее значение из набора
in слово ...
Если конструкция in слово ... опущена, то список выполняется для каждого формального аргумента.
Условный оператор:
if список_1 then список_2 [elif список_3 then список_4] ... [else список_5] fi
Выполняется список_1. Если код его завершения 0, то выполняется список_2, в противном случае - список_3, и если код его завершения 0, то выполняется список_4 и т.д. Если же коды завершения всех списков, использованных в качестве условий, оказались ненулевыми, выполняется else-часть (список_5). Если else-часть отсутствует и ни одна then-часть не выполнялась, возвращается нулевой код завершения.
Оператор цикла while (until):
while список_1 do список_2 done
Пока код завершения последней команды списка_1 есть 0, выполняются команды списка_2. При замене служебного слова while на until условие продолжения цикла меняется на противоположное. Если команды из списка_2 не выполнялись вообще, код завершения устанавливается равным нулю.
Оператор выбора:
case слово in [шаблон [| шаблон] ...) список ;;] ... esac
Выполняется список, соответствующий первому из шаблонов, успешно сопоставленных со словом. Формат шаблона аналогичен используемому для генерации имен файлов (см. далее).
Определение функции:
имя () открывающая_скобка список закрывающая_скобка
Определяется функция с заданным именем. Список является ее телом, которое окружают круглые или фигурные скобки. Для вызова функции используется обычный синтаксис команды:
имя [аргумент ...]
Если тело функции заключено в фигурные скобки, она выполняется в рамках текущего процесса; в случае круглых скобок порождается отдельный процесс. На время выполнения функции аргументы $1, $2, ..., а также служебная переменная # получают новые значения, определенные аргументами команды вызова. Затем восстанавливаются старые значения.