Циклы Bash

В этой статье мы продолжим наш цикл про написание скриптов на Bash. Мы уже рассмотрели как работать с архивами и создавать функции, но этого еще недостаточно. Любой уважающий себя язык программирования должен содержать циклы. Цикл - это такая последовательность, которая позволяет выполнять определенный участок кода необходимое количество раз.


С помощью циклов вы можете очень сильно сократить количество строк кода, которые необходимо написать для однотипных операций. В этой статье мы рассмотрим что такое циклы Bash, как их создавать и использовать.


Циклы Bash


Как я уже сказал, циклы позволяют выполнять один и тот же участок кода необходимое количество раз. В большинстве языков программирования существует несколько типов циклов. Большинство из них поддерживаются оболочкой Bash. Мы рассмотрим их все в сегодняшней статье, но сначала поговорим какими они бывают:


  • for - позволяет перебрать все элементы из массива или использует переменную-счетчик для определения количества повторений;

  • while - цикл выполняется пока условие истинно;

  • until - цикл выполняется пока условие ложно.

Циклы Bash, это очень полезная вещь и разобраться с ними будет несложно. Bash позволяет использовать циклы как в скриптах, так и непосредственно в командной оболочке. Дальше мы рассмотрим каждый из этих видов циклов.


Цикл for


Цикл for bash применяется очень часто из-за своей специфики. Его проще всего использовать когда вы знаете сколько раз нужно повторить операцию или вам нужно просто обработать по очереди все элементы массива и вы не хотите контролировать количество повторений.


Цикл for имеет несколько синтаксисов и может вести себя по разному. Для перебора элементов списка удобно использовать такой синтаксис:


for переменная in список

do

команда1

команда2

done


Каждый цикл for независимо от типа начинается с ключевого слова for. Дальше все зависит от типа. В этом случае после for указывается имя переменной, в которую будет сохранен каждый элемент списка, затем идет ключевое слово in и сам список. Команды, которые нужно выполнять в цикле размещаются между словами do и done.


Проверим все на практике и напишем небольшой скрипт, который будет выводить номера от 1 до 5:



 vi for1.sh


!/bin/bash

for number in 1 2 3 4 5

do

echo $numner

done



Дайте скрипту права на выполнение и запустите его:



 chmod +x for1.sh

./for1.sh




Вы увидите, что все выполняется так, как и предполагалось. Программа выведет цифры от 1 до 5, которые мы перечислили в массиве. Вы можете передать циклу любой массив, например, вывод какой-либо другой команды:



!/bin/bash

for iface in $(ls /sys/class/net/)

do

echo $iface

done








Как вы уже поняли, этот цикл выводит список всех, подключенных к системе сетевых интерфейсов. Но в цикле вы можете не только их выводить, но и выполнять какие-либо действия.


Следующий тип цикла for похож на его реализацию в языках программирования Си и С++. Он состоит из трех частей, инициализатора счетчика, условия продолжения выполнения и действия над счетчиком. Вот синтаксис:


for ((счетчик=1; счетчик < 10; счетчик++))

do

команда1

команда2

done


Этот цикл немного сложнее, но он позволяет сделать больше. С помощью такого цикла можно не только перебирать массивы, но и сделать необходимое количество повторений. Рассмотрим пример:



!/bin/bash

for ((i=1; i < 10; i++))

do

echo $i

done








Результат странный, правда? Обратите внимание, как выполняется проверка условия. Значение счетчика сравнивается с эталоном. Действие с переменной счетчиком выполняется сразу же после завершения основного блока команд, а уже потом делается сравнение. Таким образом, у нас при первом выполнении i равно 1, а после него уже два 2. Теперь к завершению девятого прохода значение счетчика будет увеличено на единицу и станет 10. Условие сравнения 10 < 10 не верно, поэтому цикл дальше не выполняется.


С помощью этого же синтаксиса можно сделать бесконечные циклы bash linux:



!/bin/bash

for ((;;))

do

echo "Бесконечный цикл, нажмите CTRL+C для выхода"

done




Если необходимо, вы можете выйти из цикла преждевременно. Но так делать не рекомендуется. Для выхода используйте команду break:



!/bin/bash

for (i=1;i<10;i++)

do

echo Значение счетчика $i

if [[ i -gt 5]]

break

fi

done





Со циклами for мы завершили, теперь вы знаете как они выглядят и что с ними делать. Дальше мы рассмотрим циклы while и until. Они намного проще и более универсальны.


Цикл While


Суть цикла While в том, что он будет повторяться до тех пор, пока будет выполняться условие, указанное в объявлении цикла. Здесь нет никаких счетчиков и если они вам нужны, то организовывать их вам придется самим. Bash цикл while имеет такой синтаксис:


while [ условие ]

do

команда1

команда2

команда3

done


Это работает так: сначала выполняется проверка на правильность условия, если true, выполняется набор команд, затем снова выполняется проверка, и так пока условие не вернет отрицательный результат. Это нам тоже нужно сделать вручную. Рассмотрим пример:



 vi while.sh


!/bin/bash

x=1

while [ $x -lt 5 ]

do

echo "Значение счетчика: $x"

x=$(( $x + 1 ))

done









Здесь сначала мы устанавливаем значение счетчика в единицу, затем, в условии сравниваем его с 5, пока счетчик меньше пяти будут выполняться команды из блока do-done. Но еще в этом блоке нам нужно увеличивать значение счетчика на единицу, что мы и делаем.


Также с помощью while мы можем прочитать несколько строк из стандартного ввода:



 vi while.sh


!/bin/bash

hile read line

do

echo $line

done






Программа будет запрашивать новые строки пока вы не передадите ей символ конца файла с помощью сочетания клавиш Ctrl+D. Бесконечный цикл while bash с помощью while еще проще организовать:



 vi while.sh


while :

do

echo "Бесконечный цикл bash, для выхода нажмите Ctrl+C"

done

Цикл until


Нам осталось рассмотреть последний цикл. Это цикл until. Он очень похож на while и отличается от него только работой условия. Если в первом нужно чтобы условие всегда было истинным, то здесь все наоборот. Цикл будет выполняться пока условие неверно. Синтаксис:


until [ условие ]

do

команда1

команда2

done


Думаю после рассмотрения реального примера со счетчиком будет намного понятнее как это работает:



!/bin/bash

count=1

until [ $count -gt 10 ]

do

echo "Значение счетчика: $count"

count=$(( $count + 1 ))

done




Мы задаем значение счетчика 1 и увеличиваем его на единицу при каждом проходе. Как только условие счетчик больше 10 выполнится, сразу цикл будет остановлен. В циклах while и until тоже можно использовать команды break и continue для выхода из цикла и завершения текущего прохода, но мы не будем это очень подробно рассматривать.


Выводы


В этой статье мы рассмотрели циклы Bash, как с ними работать и в каких ситуациях их можно использовать. Циклы могут стать отличным и незаменимым инструментом при создании сложных скриптов администрирования системы. Если у вас остались вопросы, спрашивайте в комментариях!


Добавить комментарий

Автору будет очень приятно получить обратную связь.

Комментариев 0