Шпаргалка по циклам в bash

 

 

Циклы это крайне удобная штука при написании любых программ или скриптов, скорее даже необходимая. Они позволяют нам выполнять некоторый участок кода заданное количество раз. Естественно в bash есть несколько видов циклов. Мы опишем циклы for in, for, while, until. Хотя for in и for считаются разным синтаксисом одного оператора, на мой взгляд они отличаются друг от друга больше чем while от until.

 

 

 

Цикл со счетчиком for in:

Цикл for in это цикл со счётчиком. Блок кода находящийся в теле цикла повторяется столько раз, сколько значений содержится в списке оператора for in при том, при каждом повторе переменная счётчика (тут она названа var, но естественно можно называть её как угодно) имеет значение следующего элемента списка.
Если ключевое слово do находится в одной строке со словом for, то после списка аргументов (перед do) необходимо ставить точку с запятой.
Каждый из элементов <список> может содержать несколько аргументов. Это бывает полезным при обработке групп параметров. В этом случае, для принудительного разбора каждого из аргументов в <списке>, необходимо использовать инструкцию set
В качестве списка, в цикле for, можно использовать переменную.
В <списке> цикла for могут быть использованы имена файлов, которые в свою очередь могут содержать символы-шаблоны. Это может очень пригодится при работе с большим количеством файлов.
Если <список> в цикле for не задан, то в качестве оного используется переменная $@ - список аргументов командной строки.
При создании списка аргументов, в цикле for можно использовать подстановку команд.
Вывод цикла может быть перенаправлен со stdout в файл или куда нибудь ещё (подробнее это можно узнать разбирая перенаправление ввода-вывода).


Синтаксис:
for var in <список>
do
<выполняемые команды>
done

Пример:
for names in name1 name2 name3 name4
do
echo $names
done

Оператор цикла for имеет ещё один способ записи - очень похожий на синтаксис оператора for в языке C. В этом случае при инициализации счётчиков задаются начальные значения переменных или одной переменной и после каждого прохода цикла проверяется условие, если проверка возвращает истину, то начинается следующий проход цикла. В блоке <приращение счётчиков> значение наших переменных счётчиков обязательно должны изменятся (не обязательно в большую сторону) так чтобы при проверки условия рано или поздно мы получили значение лож, иначе цикл никогда не закончится. Очень удобный и главное привычный вариант, в случае если какую либо операцию нужно повторить заданное количество раз.

С подобный синтаксис:
for (( <инициализация счётчиков>; <проверка условия>; <приращение счётчиков>))
do
<выполняемые команды>
done

Пример:
for ((var=1; var <= LIMIT ; var++))
do
echo $var
done

Цикл while:

Это достаточно простая конструкция, которая проверяет условие стоящее за оператором while и в случае истинности этого условия выполняет блок команд находящийся между словами do и done и затем опять переходит к проверки условия. В случае если проверка вернет лож, то цикл заканчивается и начинаю выполнятся команды следующие за done. Нужно обязательно следить за тем чтобы <проверка условия> зависела от кода выполняющегося в цикле иначе, если результат проверки не изменяется вы получите бесконечный цикл.
Стандартное устройство ввода, для цикла while, можно перенаправить на файл с помощью команды перенаправления < в конце цикла.

Синтаксис:
while <Проверка условия>
do
<Блок команд, обязательно меняющий переменные влияющие на проверку условия>
done

Пример:
while [ $var0 -eq 100 ]
do
echo $var
var++
done

Оператор while может иметь несколько условий. Но только последнее из них определяет возможность продолжения цикла. В этом случае синтаксис оператора цикла будет отличатся от обычного.
Синтаксис (Ещё раз повторюсь, что на выполнение цикла влияет только последнее условие):
while
<условие1>
<условие2>

<условиеN>
do
<выполняемые команды — тело цикла>
done

Цикл until:

Оператор until очень похож на while, он тоже вычисляет условие, но выполняет тело цикла в случае если результатом вычисления будет лож. Может показаться непривычным, но until вычисляет условие перед первым проходом цикла, как и while, а не после него. Как и в случае с циклами for/in, при размещении ключевого слова do в одной строке с объявлением цикла, необходимо вставлять символ ";" перед do.
Как и в предыдущем случае важно помнить что условие должно зависеть от операций в теле цикла, иначе наш скрипт никогда не завершится.

Синтаксис:
until <Проверка условия>
do
<Блок команд, обязательно меняющий переменные влияющие на проверку условия>
done

Пример:
until [ $var0 -gt 100] # Проверка условия производится в начале итерации.
do
echo $var
var--
done

Наверное пока хватит. :)

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


Защитный код
Обновить