Что такое цикл linux

Глава 10. Циклы и ветвления

Управление ходом исполнения — один из ключевых моментов структурной организации сценариев на языке командной оболочки. Циклы и преходы являются теми инструментальными средствами, которые обеспечивают управление порядком исполнения команд.

10.1. Циклы

Цикл — это блок команд, который исполняется многократно до тех пор, пока не будет выполнено условие выхода из цикла.

циклы for

Это одна из основных разновидностей циклов. И она значительно отличается от аналога в языке C.

На каждом проходе цикла, переменная-аргумент цикла arg последовательно, одно за другим, принимает значения из списка list.

Элементы списка могут включать в себя шаблонные символы.

Есл ключевое слово do находится в одной строке со словом for, то после списка аргументов (перед do) необходимо ставить точку с запятой.

Пример 10-1. Простой цикл for

Каждый из элементов [списка] может содержать несколько аргументов. Это бывает полезным при обработке групп параметров. В этом случае, для принудительного разбора каждого из аргументов в списке, необходимо использовать инструкцию set (см. Пример 11-13).

Пример 10-2. Цикл for с двумя параметрами в каждом из элементов списка

В качестве списка, в цикле for, можно использовать переменную.

Пример 10-3. Fileinfo: обработка списка файлов, находящегося в переменной

В [списке] цикла for могут быть использованы имена файлов, которые в свою очередь могут содержать символы-шаблоны.

Пример 10-4. Обработка списка файлов в цикле for

Если [список] в цикле for не задан, то в качестве оного используется переменная $@ — список аргументов командной строки. Оень остроумно эта особенность проиллюстрирована в Пример A-18.

Пример 10-5. Цикл for без списка аргументов

При создании списка аргументов, в цикле for допускается пользоваться подстановкой команд. См. Пример 12-39, Пример 10-10 и Пример 12-33.

Пример 10-6. Создание списка аргументов в цикле for с помощью операции подстановки команд

Более сложный пример использования подстановки команд при создании списка аргументов цикла.

Пример 10-7. grep для бинарных файлов

Еще один пример.

Пример 10-8. Список всех пользователей системы

И заключительный пример использования подстановки команд при создании [списка].

Пример 10-9. Проверка авторства всех бинарных файлов в текущем каталоге

Результат работы цикла for может передаваться другим командам по конвейеру.

Пример 10-10. Список символических ссылок в каталоге

Вывод цикла может быть перенаправлен со stdout в файл, ниже приводится немного модифицированный вариант предыдущего примера, демонстрирующий эту возможность.

Пример 10-11. Список символических ссылок в каталоге, сохраняемый в файле

Оператор цикла for имеет и альтернативный синтаксис записи — очень похожий на синтаксис оператора for в языке C. Для этого используются двойные круглые скобки.

Пример 10-12. C-подобный синтаксис оператора цикла for

А сейчас пример сценария, который может найти «реальное» применение.

Пример 10-13. Работа с командой efax в пакетном режиме

Оператор while проверяет условие перед началом каждой итерации и если условие истинно (если код возврата равен 0 ), то управление передается в тело цикла. В отличие от циклов for, циклы while используются в тех случаях, когда количество итераций заранее не известно.

Как и в случае с циклами for/in , при размещении ключевого слова do в одной строке с объявлением цикла, необходимо вставлять символ «;» перед do.

Обратите внимание: в отдельных случаях, таких как использование конструкции getopts совместно с оператором while, синтаксис несколько отличается от приводимого здесь.

Пример 10-14. Простой цикл while

Пример 10-15. Другой пример цикла while

Оператор while может иметь несколько условий. Но только последнее из них определяет возможность продолжения цикла. В этом случае синтаксис оператора цикла должен быть несколько иным.

Пример 10-16. Цикл while с несколькими условиями

Как и в случае с for, цикл while может быть записан в C-подобной нотации, с использованием двойных круглых скобок (см. так же Пример 9-28).

Пример 10-17. C-подобный синтаксис оформления цикла while

Стандартное устройство ввода stdin, для цикла while, можно перенаправить на файл с помощью команды перенаправления в конце цикла.

Оператор цикла until проверяет условие в начале каждой итерации, но в отличие от while итерация возможна только в том случае, если условие ложно.

Обратите внимание: оператор until проверяет условие завершения цикла ПЕРЕД очередной итерацией, а не после, как это принято в некоторых языках программирования.

Как и в случае с циклами for/in , при размещении ключевого слова do в одной строке с объявлением цикла, необходимо вставлять символ «;» перед do.

Источник

Фундаментальные основы Linux. Часть VI. Сценарии

Глава 22. Циклы в сценариях

Команда test []

Условный переход if then else

Условный переход if then elif

Цикл for

Цикл while

Цикл until

Практическое задание: проверки и циклы в сценариях

1. Разработайте сценарий, который будет использовать цикл for для отсчета от 3 до 7.

2. Разработайте сценарий, который будет использовать цикл for для отсчета от 1 до 17000.

3. Разработайте сценарий, который будет использовать цикл while для отсчета от 3 до 7.

4. Разработайте сценарий, который будет использовать цикл until для обратного отсчета от 8 до 4.

5. Разработайте сценарий, который будет производить подсчет файлов с расширением .txt в текущей директории.

6. Используйте оператор if в созданном сценарии для его корректной работы в случае отсутствия файлов с расширением .txt в текущей директории.

Корректная процедура выполнения практического задания: проверки и циклы в сценариях

1. Разработайте сценарий, который будет использовать цикл for для отсчета от 3 до 7.

2. Разработайте сценарий, который будет использовать цикл for для отсчета от 1 до 17000.

3. Разработайте сценарий, который будет использовать цикл while для отсчета от 3 до 7.

4. Разработайте сценарий, который будет использовать цикл until для обратного отсчета от 8 до 4.

5. Разработайте сценарий, который будет производить подсчет файлов с расширением .txt в текущей директории.

6. Используйте оператор if в созданном сценарии для его корректной работы в случае отсутствия файлов с расширением .txt в текущей директории.

Источник

IgorKa — Информационный ресурс

Немного обо всем и все о немногом, или практический опыт системного администратора.

Декабрь 2009
Пн Вт Ср Чт Пт Сб Вс
« Ноя Янв »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

Лекция №22 — bash. Циклы и функции

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

Цикл for

Цикл for в bash имеет два вида. Рассмотрим сначала классический вариант for. Общий вид следующий:

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

А вот практический пример:

Как вы помните из прошлой лекции переменные в bash не имеют типа поэтому в последовательности могут быть как цифры так и строки или символы.

Если запустить такой скрипт на выполнение получим следующий результат:

/ linux$ . / testfor.sh
i = 1
i = 2
i = 3
i =a
i =b
i =c

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

Результат будет таким же как и в первом примере.

Если необходимо задать последовательность чисел, то можно воспользоваться командой seq и механизмом подстановки. Команда seq возвращает на экран последовательность числовых значений. Синтаксис прост и будет понятен из примера ниже:

/ linux$ seq 6
1
2
3
4
5
6
igor @ ubuntu:

/ linux$ seq 4 6
4
5
6
igor @ ubuntu:

/ linux$ seq 1 2 6
1
3
5

Используя механизм подстановки, а именно конструкцию $( ) получим следующий пример:

/ linux$ . / testfor.sh
i = 2
i = 4
i = 6
i = 8
i = 10

Здесь хочу напомнить о двойных кавычках. Если взять конструкцию $(seq 2 2 10) в двойные кавычки, то результат возвращенный командой seq 2 2 10, а именно 2 4 6 8 10, будет интерпретирован как один элемент:

/ linux$ . / testfor.sh
i = 2 4 6 8 10

Вернемся ко второму виду for. Часто в скриптах можно встретить так называемый С-подобный вариант for, которых используется для циклов на основе чисел. Рассмотрим сразу пример:

Как видите конструкция i in $(seq 5) в данном примере заменена на ((i=1;i while выражение
do
команды
done

Цикл выполняется пока проверяемое в выражении условие верно. Как только выражение возвращает ложь выполнение цикла прекращается.

В нашем примере проверяется, что переменная i меньше (-lt), числа 7 и если это так, то значение переменной выводится на экран. Выражение let i=i+1, увеличивает переменную на единицу, снова происходит проверка и т.д. let говорит интерпретатору о том, что аргументы следует распознавать как числовые значения. Это строку можно было записать как let i++ (c-подобный вариант). При увеличении числа более чем на единицу можно записать так: let i+=2 — в этом случае i будет увеличиваться с шагом 2. Еще один вариант увеличения переменной это использование встроенного калькулятора (работает только с целыми числами). Доступ к калькулятору можно получить через двойные скобки: i=$(($i+1)) или через квадратные: i=$[$i+1] Пользоваться калькулятором можно и в командной строке:

/ linux$ echo $ ( ( 23 * 345 ) )
7935
igor@ubuntu :

/ linux$ echo $ ( ( 345 / 5 ) )
69
igor@ubuntu :

/ linux$ echo $ ( ( 69 * 5 ) )
345

Цикл until

Похож на while с той лишь разницей, что в нем команды внутри цикла выполняются тогда когда условие не выполняется. Синтаксис такой же только вместо while используется until. Пример:

С циклами нужно быть аккуратными, чтобы не получить вариант бесконечного цикла. Кстати для отладки bash скриптов можно изменить первую строку на#!/bin/bash -x или запускать скрипт командой bash -x:

/ linux$ bash -x . / testfor.sh
+ i = 1
+ ‘[‘ 1 -gt 5 ‘]’
+ echo i = 1
i = 1
+ let i =i+ 1
+ ‘[‘ 2 -gt 5 ‘]’
+ echo i = 2
i = 2
+ let i =i+ 1
+ ‘[‘ 3 -gt 5 ‘]’
+ echo i = 3
i = 3
+ let i =i+ 1
+ ‘[‘ 4 -gt 5 ‘]’
+ echo i = 4
i = 4
+ let i =i+ 1
+ ‘[‘ 5 -gt 5 ‘]’
+ echo i = 5
i = 5
+ let i =i+ 1
+ ‘[‘ 6 -gt 5 ‘]’

Обязательно потренируйтесь в написании небольших скриптов для закрепления понимания работы циклов в bash.

Функции в bash

Функции применяются в bash очень широко. Описываются функции двумя способами: с ключевым словом function, и без него.

Вызывается функция по имени в любом месте скрипта, но только после описания самой функции. Функции также можно передавать параметры, которые задаются через пробел после вызова (имени) функции. Рассмотрим пример скрипта bash:

В данном примере задана функция с именем primer. Вызов функции с параметрами: primer a b c и без параметров: primer. В теле функции все конструкции вам должны быть знакомы, за исключением $#, $i и $@. $# — возвращает количество параметров переданных функции. В нашем примере это будет число 3. $@возвращает все параметры одной строкой. В примере это будет a b c. А через $1, $2, $3 и т.д. можно обращаться к каждому параметру персонально. $? — содержит код выполнения последней команды. В нашем примере код выполнения функции.

Функция может также возвращать числовое значение через ключевое слово return. Как правило возвращают 0, если функция выполнена без ошибок или отличное от нуля значение, если что-то пошло не так. В примере, в случае вызова функции с параметрами, идет возврат значения 0, а если функция вызывалась без параметров, то будет возврат кода 1.

Все, что касается передачи параметров в функцию, работает точно так же и для скрипта. Скрипту точно также можно передавать параметры и точно также манипулировать ими при помощи $#, $@, $N. Из этой же категории и вариант — $0 — который возвращает имя команды запустившей скрипт. Если скрипт запускался по команде ./script.sh, то echo $0 вернет значение ./script.sh, а если по команде /home/igor/linux/script.sh, то будет возвращено значение /home/igor/linux/script.sh.

Читать другие лекции по курсу Администратор ПК с Linux

Спасибо за то что поделились ссылкой!

Теги: bash, Linux, лекция
Рубрика: Курсы Администратор ПК с Linux | Отзывы (RSS)

Статьи и новости схожей тематики:

Комментариев: 4

IgorKa — Информационный ресурс » Лекция №23 — bash. Объединение команд:

[. ] других командах. Но сначала о незаслуженно забытой на прошлой лекции конструкции [. ]

Dimon:

На заметку!
При написании скриптов типа описанного:
#!/bin/bash
i=1
until [ $i -gt 6 ]
do
echo “until $i”
i=$[$i+1] #или можно написать let i++
выдается ошибка типа “…ожидается использование унарного оператора”. Избежать этого можно используя [[]] вместо []. Идея не моя — найдена на ниже представленной страничке. УСПЕХОВ ВСЕМ. ))
donehttp://www.adminworld.ru/freebsd/chastye-oshibki-programmirovaniya-na-bash.html

Dimon:

пардон )) ошибочка — описанная выше ошибка появляется, только, если не объявить переменную, то есть при отсутствии строчки i=1. Так что милостиво прошу изавинить меня, Дамы и Господа.
P/S если кто-то очень сильно запутается от этой билиберды,то задайте вопрос ответом на мой коммент. Объясну (если смогу))

Андрюха:

Dimon, нормально все, не ошибается только тот, кто ничего не делает.

Источник

Читайте также:  Install composer windows xampp
Оцените статью