Сценарии оболочки · 6 min read · Nov 14, 2025
Часть 4: Структуры управления повторением в сценариях оболочки
Добро пожаловать в четвертую часть учебного пособия по сценариям оболочки HowtoForge (Нажмите здесь, чтобы прочитать часть 1, часть 2 и часть 3 учебника). В этой части мы рассмотрим различные структуры управления повторением в оболочке bash и как использовать каждую структуру, предоставив несколько примеров. Давайте начнем.
Введение
Структура управления повторением, также известная как структура управления циклами, является типом структуры управления в языках программирования, которая используется для упрощения повторяющихся или рекурсивных задач. Циклические операторы оптимизируют любой код, предоставляя способ минимизировать код, что делает его легче для отладки, чем неструктурированный код, обеспечивающий тот же вывод. Существует три типа циклических операторов, которые поддерживает оболочка bash - циклы for, while и until.
Циклы For
Цикл for - это циклический оператор, который использует ключевое слово for для объявления повторяющегося оператора. Bash поддерживает различные синтаксисы для оператора цикла for:
Синтаксис 1: Структура For-in
for in
do
#### ваш оператор здесь
done
Этот синтаксис начинается с ключевого слова for, затем следует имя переменной, ключевое слово in и список возможных значений для переменной. Каждое значение в списке будет разделено пробелом, а начало строк кода, которые будут повторяться, определяется в do и заканчивается ключевым словом done.
Давайте создадим простой оператор цикла for, который позволит пользователю ввести 5 значений и получить сумму чисел:
#!/bin/bash
result=0;
input=0;
for var in 1 2 3 4 5
do
printf "Введите целое число %d : " $var
read input
result=$((result+input))
done
echo "результат равен " $result
В этом примере переменная var служит счетчиком нашего цикла. Ее значение определяется в списке чисел после ключевого слова in, и оболочка изменяет значения переменной var после каждого выполнения цикла в операторе цикла. Поскольку в нашем списке всего пять целых значений, оболочка выполнит коды внутри нашего оператора цикла только пять раз.
Синтаксис 2: Оператор цикла For с строковыми значениями списка
Вы также можете объявить переменную, которая будет хранить список элементов для вашего счетчика. Например, рассмотрим следующий код:
#!/bin/bash
list="var1 var2 var3 var4"
var=""
mkdir sample
cd sample
echo создаем "каталоги...."
for var in $list
do
mkdir $var
done
Строка list=”var1 var2 var3 var4” определяет значения переменной списка. Затем она была присвоена var в строке for var in $list, и, наконец, каталоги создаются в строке mkdir $var.
Синтаксис 3: Оператор цикла For с списком из файла
Вы также можете получить список из существующего файла для использования в операторе цикла for вместо объявления его внутри вашего кода, используя команду cat. Например, откройте ваш любимый текстовый редактор и запишите как минимум пять имен каталогов.

Затем откройте новую вкладку в том же текстовом редакторе и создайте новый скрипт. Этот скрипт должен быть сохранен в том же каталоге, где сохранен список каталогов, который вы ранее создали.
#!/bin/bash
dirList=$(cat list)
echo "создание каталогов...."
for var in $dirList
do
mkdir $var
done
Этот пример становится полезным, когда вам нужно создать сотни каталогов на вашем компьютере с Linux, не так ли?
Синтаксис 4: Синтаксис, похожий на C
for((initialization; boolean_test; increment/decrement))
do
#### ваш код здесь
doneВозможно, наиболее знакомая структура цикла for, которую поддерживает оболочка, - это структура, похожая на C. Цикл начинается с инициализации переменной-счетчика, а затем оболочка оценивает логическое выражение, объявленное после инициализации. Если результат логического выражения истинный, оболочка выполнит набор операторов внутри условия do, в противном случае она завершает оператор цикла и переходит к строке после ключевого слова done. Оболочка перейдет к следующей итерации через оператор инкремента или декремента, объявленный после логического теста. В качестве примера давайте реконструируем наш первый пример, используя эту структуру.
#!/bin/bash
result=0
input=0
for((var=1;var<=5;var++))
do
printf "Введите целое число %d : " $var
read input
result=$((result+input))
done
echo $result
Оператор цикла While
Оператор while - это тип повторяющейся структуры в bash, который использует ключевое слово while. В отличие от синтаксиса типа C для структуры цикла for, структура управления повторением while отделяет инициализацию, логический тест и оператор инкремента/декремента.
Синтаксис 1: Структура While с условными операторами на основе арифметических символов
while(condition)
do
###ваш код здесь
done Чтобы отличить while от других операторов циклов, давайте создадим наш первый пример для оператора while.
#!/bin/bash
result=0
input=0
var=1
while((var <= 5))
do
printf "Введите целое число %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "результат равен " $result
Смотрим на наш пример, оператор while начинается с инициализации нашей переменной-счетчика var. Далее логический тест объявляется после ключевого слова while, а набор операторов, которые будут повторяться, будет объявлен внутри операторов do и done. В операторах while интерпретатор начнет и выполнит повторение кодов только если результат логического теста истинный. С другой стороны, оператор цикла завершит итерацию кодов только тогда, когда результат логического выражения станет ложным.
Синтаксис 2: Оператор цикла While с условным оператором на основе мнемоники
while [ ]
do
####ваш код здесь
done Вы также можете объявить условный оператор на основе мнемоники внутри оператора цикла while. Для объявления будет использоваться квадратная скобка вместо круглой. (Посмотрите мнемонические условные операторы здесь) Например:
#!/bin/bash
var=1;
while [ $var -le 5 ]
do
printf "Введите целое число %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "результат равен " $result
Синтаксис 3: Оператор цикла While с условным оператором на основе файла
while read
do
####ваш код здесь
done <<путь к текстовому файлу> Так же, как и в операторе цикла for, вы также можете открыть текстовый файл и связать его с оператором цикла while. Например:
#!/bin/bash
mkdir sample2
cd sample2
echo "создание каталогов..."
while read var
do
mkdir $var
done

В этом примере я использовал список, который мы создали ранее, и создал новый скрипт в том же каталоге. Обратите внимание, что если ваш текстовый файл находится в другом каталоге, вам нужно указать точный путь к файлу после символа <.
Оператор цикла Until
Другой тип циклического оператора, который поддерживает bash, - это структура until. Оператор until выполняет каждую команду внутри цикла до тех пор, пока объявленное логическое выражение не станет ложным. Это полная противоположность оператору while.
Синтаксис 1: Цикл Until с условным оператором на основе арифметических символов
until (())
do
####набор команд
done Давайте рассмотрим пример:
result=0
input=0
var=1
until((var > 5))
do
printf "Введите целое число %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "результат равен " $result
Синтаксис 2: Оператор цикла Until с условным оператором на основе мнемоники
until [ ]
do
####ваш код здесь
done Поскольку оператор until является просто противоположностью оператора while, вы также можете объявить условный оператор на основе мнемоники в структуре until. Однако, чтобы завершить цикл, вам нужно объявить противоположный условный оператор - то есть, сделать так, чтобы условный оператор оценивался как ложный.
!/bin/bash
result=0
input=0
var=1
until [ $var -gt 5 ]
do
printf "Введите целое число %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "результат равен " $result
Заключение
Эта часть учебника охватывает три структуры циклов, которые поддерживает bash - операторы циклов for, while и until. Каждый из этих операторов имеет различную структуру, использование и преимущества. Bash поддерживает различные структуры, предоставляя больше возможностей программистам и, таким образом, упрощая написание сценариев оболочки.
Get new posts in your inbox
No spam. Unsubscribe anytime.