Меню Рубрики

Bash linux цикл for

Циклы 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:

!/bin/bash
for number in 1 2 3 4 5
do
echo $number
done

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

chmod +x for1.sh
./for1.sh

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

for iface in $(ls /sys/class/net/)
do
echo $iface
done

Читайте также:  Как правильно установить linux mint 17 рядом с windows 7

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

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

for (( счетчик = 1 ; счетчик 10 ; счетчик ++ ))
do
команда1
команда2
done

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

Результат странный, правда? Обратите внимание, как выполняется проверка условия. Значение счетчика сравнивается с эталоном. Действие с переменной счетчиком выполняется сразу же после завершения основного блока команд, а уже потом делается сравнение. Таким образом, у нас при первом выполнении i равно 1, а после него уже два 2. Теперь к завершению девятого прохода значение счетчика будет увеличено на единицу и станет 10. Условие сравнения 10 !/bin/bash
for ((;;))
do
echo “Бесконечный цикл, нажмите CTRL+C для выхода”
done

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

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

Цикл While

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

while [ условие ]
do
команда1
команда2
команда3
done

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

!/bin/bash
x=1
while [ $x -lt 5 ]
do
echo “Значение счетчика: $x”
x=$(( $x + 1 ))
done

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

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

!/bin/bash
hile read line
do
echo $line
done

Читайте также:  Seven square linux mint

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

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, как с ними работать и в каких ситуациях их можно использовать. Циклы могут стать отличным и незаменимым инструментом при создании сложных скриптов администрирования системы. Если у вас остались вопросы, спрашивайте в комментариях!

Источник

BASH: описание циклов for, while, until и примеры использования

Краткое описание разницы в типах циклов:

for — будет выполнять действие до тех пор, пока есть объекты для выполнения (например — чтение потока из stdin , файла или функции);
while — выполняет действие до тех пор, пока условие является истинным;
until — будет выполняться до тех пор, пока условие не станет истинным, т.е. пока оно false .

Цикл FOR

Рассмотрим такой вариант скрипта с циклом:

Синтаксис очень простой и достаточно наглядно показан в примере:

for (запускаем цикл) variable (объявляем переменную, над которой будем выполнять действия) in (направляем циклу поток) `ls -1` (команда, которую необходимо выполнить и передать в переменную $variable ). Do и done — «тело» цикла, в рамках которых будут выполняться основные действия над полученными данными, а echo “$variable” — непосредственно само действие, выполняемое циклом.

Теперь немного изменим пример, и вместо явного указания команды — применим вторую переменную:

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

Основное условие цикла for — он будет выполняться до тех пор, пока в переданной ему команде есть объекты для действия. Исходя из примера выше — пока в листинге ls -1 есть файлы для отображения — цикл будет передавать их в переменную и выполнять «тело цикла». Как только список файлов в директории закончится — цикл завершит своё выполнение.

Читайте также:  Ftp клиент linux командная строка

Давайте немного усложним пример.

В каталоге имеется список файлов:

Нам необходимо выбрать из них только те, которые в названии не имеют слова «no«:

В цикле так же можно использовать условные выражения (conditional expressions) […] для проверки условий и оператор break для прерывания цикла в случае срабатывания условия.

Рассмотрим такой пример:

Цикл будет выполняться до тех пор, пока не будет встречен файл loop.sh . Как только выполнение цикла дойдёт до этого файла — цикл будет прерван командой break :

Ещё один пример — использование арифметических операций непосредственно перед выполнением тела цикла:

Тут мы задаём три управляющих команды — count=1 , контролирующее условие — пока count меньше 11, и команду для выполнения — count +1 :

Циклы WHILE и UNTIL

Простой пример, хорошо демонстрирующий принцип работы цикла while :

Мы задаём переменную $count равной нулю, после чего запускаем цикл whi le с условием «пока $count меньше десяти — выполнять цикл». В теле цикла мы выполняем постфиксный инкремент +1 к переменной $count и результат выводим в stdout .

Как только значение переменной $count стало 10 — цикл прекратился.

Хороший пример «бесконечного» цикла, который демонстрирует работу while :

Аналогично, но «в обратную сторону» работает и цикл until :

Тут мы задаём похожее условие, но вместо «пока переменная меньше 10» — указываем «пока переменная не станет больше чем 10». Результат выполнения:

Если же приведённый выше пример «бесконечного цикла» выполнить с использованием until — о не выведет ничего, в отличии от while :

Так как «условие» изначально «истинно» — тело цикла выполняться не будет.

Как и в цикле for — в while и until можно использовать функции. Для примера — цикл из реально использующегося скрипта, выполняющий проверку статуса сервера Tomcat ( PID берётся в системе SLES, в других системах может отличаться), немного упрощенный вариант:

Функция answer описывалась в статье BASH: использование функций, примеры, но тут используется немного улучшенный вариант:

Тут можно было использовать как while , так и until — но не цикл for, так как for сработал бы один раз (получил PID — и завершился).

Источник

Adblock
detector