Сценарии оболочки · 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

Циклический оператор, использующий for в bash

В этом примере переменная 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

Чтение строковых значений с использованием оператора цикла for

Строка list=”var1 var2 var3 var4” определяет значения переменной списка. Затем она была присвоена var в строке for var in $list, и, наконец, каталоги создаются в строке mkdir $var.

Синтаксис 3: Оператор цикла For с списком из файла

Вы также можете получить список из существующего файла для использования в операторе цикла for вместо объявления его внутри вашего кода, используя команду cat. Например, откройте ваш любимый текстовый редактор и запишите как минимум пять имен каталогов.

Создание каталогов из текстового файла с использованием цикла for

Затем откройте новую вкладку в том же текстовом редакторе и создайте новый скрипт. Этот скрипт должен быть сохранен в том же каталоге, где сохранен список каталогов, который вы ранее создали.

#!/bin/bash   
 dirList=$(cat list)   
 echo "создание каталогов...."  
 for var in $dirList   
 do   
 mkdir $var   
 done

Создание каталогов из текстового файла с использованием цикла for

Этот пример становится полезным, когда вам нужно создать сотни каталогов на вашем компьютере с 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

Операторы цикла For в bash

Оператор цикла 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 в сценариях оболочки Bash

Смотрим на наш пример, оператор 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

Оператор цикла While в сценариях оболочки

Синтаксис 3: Оператор цикла While с условным оператором на основе файла

while read   
 do   
 ####ваш код здесь   
 done <<путь к текстовому файлу>

Так же, как и в операторе цикла for, вы также можете открыть текстовый файл и связать его с оператором цикла while. Например:

#!/bin/bash   
 mkdir sample2  
cd sample2   
 echo "создание каталогов..."  
 while read var   
 do   
     mkdir $var   
 done

Чтение файла с использованием цикла while в сценариях bash

В этом примере я использовал список, который мы создали ранее, и создал новый скрипт в том же каталоге. Обратите внимание, что если ваш текстовый файл находится в другом каталоге, вам нужно указать точный путь к файлу после символа <.

Оператор цикла 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

Оператор цикла Until в сценариях оболочки

Синтаксис 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

Оператор цикла until в сценариях оболочки

Заключение

Эта часть учебника охватывает три структуры циклов, которые поддерживает bash - операторы циклов for, while и until. Каждый из этих операторов имеет различную структуру, использование и преимущества. Bash поддерживает различные структуры, предоставляя больше возможностей программистам и, таким образом, упрощая написание сценариев оболочки.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.