Циклы — одна из фундаментальных концепций языков программирования. Циклы удобны, когда вы хотите запускать серию команд снова и снова, пока не будет достигнуто определенное условие.
В этом руководстве мы рассмотрим основы циклов for в Bash. Мы также покажем вам, как использовать операторы break и continue чтобы изменить ход цикла.
Стандартный for цикл в Bash
Цикл for выполняет итерацию по списку элементов и выполняет заданный набор команд.
Цикл for Bash имеет следующую форму:
Список может быть серией строк, разделенных пробелами, диапазоном чисел, выводом команды, массивом и т. Д.
Оберните струны
В приведенном ниже примере цикл будет перебирать каждый элемент в списке строк, и переменный element будет установлен на текущий элемент:
Цикл выдаст следующий результат:
Цикл по диапазону чисел
Вы можете использовать выражение последовательности, чтобы указать диапазон чисел или символов, задав начальную и конечную точки диапазона. Выражение последовательности принимает следующую форму:
Вот пример цикла, который перебирает все числа от 0 до 3:
Начиная с Bash 4, также можно указывать приращение при использовании диапазонов. Выражение принимает следующий вид:
Вот пример, показывающий, как увеличить на 5:
Перебирать элементы массива
Вы также можете использовать цикл for для перебора массива элементов.
В приведенном ниже примере мы определяем массив с именем BOOKS и перебираем каждый элемент массива.
Цикл for в Bash в стиле C
Синтаксис цикла for стиле C имеет следующий вид:
Цикл повторится 1001 раз и выдаст следующий результат:
Операторы break и continue
Операторы break и continue могут использоваться для управления выполнением цикла for.
Оператор break
Оператор break завершает текущий цикл и передает управление программой оператору, следующему за завершенным оператором. Обычно он используется для завершения цикла при выполнении определенного условия.
В следующем примере мы используем оператор if для прекращения выполнения цикла, когда текущий повторяемый элемент становится равным «Lithium».
Оператор continue
Оператор continue завершает текущую итерацию цикла и передает управление программой следующей итерации цикла.
В следующем примере мы перебираем диапазон чисел. Когда текущий повторяемый элемент равен ‘2’, оператор continue заставит выполнение вернуться к началу цикла и продолжить следующую итерацию:
Примеров циклов for в Bash
Переименование файлов с пробелами в имени файла
В следующем примере показано, как переименовать все файлы в текущем каталоге с пробелом в его именах, заменив пробел на подчеркивание:
Давайте разберем код построчно:
Изменение расширения файла
Давайте проанализируем код построчно:
Выводы
Цикл for Bash используется для повторного выполнения заданного набора команд определенное количество раз.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Глава 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
Пример 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. Список символических ссылок в каталоге, сохраняемый в файле
Пример 10-12. C-подобный синтаксис оператора цикла for
А сейчас пример сценария, который может найти «реальное» применение.
Пример 10-13. Работа с командой efax в пакетном режиме
Оператор while проверяет условие перед началом каждой итерации и если условие истинно (если код возврата равен 0 ), то управление передается в тело цикла. В отличие от циклов for, циклы while используются в тех случаях, когда количество итераций заранее не известно.
Обратите внимание: в отдельных случаях, таких как использование конструкции 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 проверяет условие завершения цикла ПЕРЕД очередной итерацией, а не после, как это принято в некоторых языках программирования.
unixforum.org
Форум для пользователей UNIX-подобных систем
bash-циклы по параметрам, и имена файлов с пробелами
Модератор: /dev/random
bash-циклы по параметрам, и имена файлов с пробелами
Сообщение rm_ » 14.02.2009 03:41
Re: bash-циклы по параметрам, и имена файлов с пробелами
Сообщение Portnov » 14.02.2009 07:39
Re: bash-циклы по параметрам, и имена файлов с пробелами
Сообщение RasenHerz » 14.02.2009 09:14
Re: bash-циклы по параметрам, и имена файлов с пробелами
Сообщение korisk » 14.02.2009 09:28
Можно попробовать пошаманить с xargs
Re: bash-циклы по параметрам, и имена файлов с пробелами
Сообщение Voice » 14.02.2009 13:11
Re: bash-циклы по параметрам, и имена файлов с пробелами
Сообщение rm_ » 14.02.2009 13:29
В общем похоже я на PHP буду этот скрипт делать, и дальше убеждаясь, что мало-мальски нетривиальные скрипты на шелле лучше даже и не начинать.
Re: bash-циклы по параметрам, и имена файлов с пробелами
Сообщение diesel » 14.02.2009 14:21
Re: bash-циклы по параметрам, и имена файлов с пробелами
Re: bash-циклы по параметрам, и имена файлов с пробелами
Сообщение rm_ » 14.02.2009 14:38
Да не в PHP дело. Ошибаетесь, если думаете что топик за этим был создан.
Я делал скрипт по преобразованию архива любого типа (из поддерживаемых atool+соотв.распаковщиком) в 7z. Теперь работает как надо. Чтобы не быть голословным, вот он:
Может ещё чего посоветуете, в bash’е я не спец. Но и на том спасибо.
watashiwa_darede. да, так покороче
Re: bash-циклы по параметрам, и имена файлов с пробелами
Сообщение diesel » 14.02.2009 14:44
Re: bash-циклы по параметрам, и имена файлов с пробелами
Сообщение rm_ » 14.02.2009 14:56
Re: bash-циклы по параметрам, и имена файлов с пробелами
В некоторых частностях они различаются, но для разработчика, а не для пользователя.
Re: bash-циклы по параметрам, и имена файлов с пробелами
Сообщение diesel » 14.02.2009 15:37
Re: bash-циклы по параметрам, и имена файлов с пробелами
Сообщение kotnaton » 13.09.2011 02:50
Пытался по этой теме конвертировать в контейнер mp4 свои TS-ки:
Вместо этого, программа просто переписала исходники, погубив мою видеоколлекцию, к несчастью, не было запасных копий.
Re: bash-циклы по параметрам, и имена файлов с пробелами
Сообщение liaonau » 13.09.2011 03:59
О чем в этой теме упоминалось.
Причем здесь «пингвин» ☺? Поразительное заявление, феерично подменяющее понятия. Речь же исключительно об использовании оболочки и стандартных утилит. Если вам (лично вам, не всем же, разумеется) не понятен используемый вами командный язык, то не используйте его. Используйте другой. Оболочек, вообще-то много больше чем одна. Ну или perl, скажем, вполне можно запускать интерпретатором ☺.
А лучше просто выучите стандартный sh. А проще всего — не использовать пробелов в именах. Если переименовать нельзя — торрент, например, раздается, то есть же хардлинк — всего две буквы — ln.
А вообще, очевидно, что потеря чего-либо после команды пользователя — не есть потеря по вине ОС. Это ж не какой-нибудь баг в ФС, убивший данные.
Re: bash-циклы по параметрам, и имена файлов с пробелами
Сообщение kotnaton » 13.09.2011 04:30
UPD: Еще раз спасибо, и. извините, если был резок.
Циклы Bash
С помощью циклов вы можете очень сильно сократить количество строк кода, которые необходимо написать для однотипных операций. В этой статье мы рассмотрим что такое циклы Bash, как их создавать и использовать.
Циклы Bash
Как я уже сказал, циклы позволяют выполнять один и тот же участок кода необходимое количество раз. В большинстве языков программирования существует несколько типов циклов. Большинство из них поддерживаются оболочкой Bash. Мы рассмотрим их все в сегодняшней статье, но сначала поговорим какими они бывают:
Циклы Bash, это очень полезная вещь и разобраться с ними будет несложно. Bash позволяет использовать циклы как в скриптах, так и непосредственно в командной оболочке. Дальше мы рассмотрим каждый из этих видов циклов.
Цикл for
Цикл for bash применяется очень часто из-за своей специфики. Его проще всего использовать когда вы знаете сколько раз нужно повторить операцию или вам нужно просто обработать по очереди все элементы массива и вы не хотите контролировать количество повторений.
Цикл for имеет несколько синтаксисов и может вести себя по разному. Для перебора элементов списка удобно использовать такой синтаксис:
for переменная in список do команда1 команда2 done
Каждый цикл for независимо от типа начинается с ключевого слова for. Дальше все зависит от типа. В этом случае после for указывается имя переменной, в которую будет сохранен каждый элемент списка, затем идет ключевое слово in и сам список. Команды, которые нужно выполнять в цикле размещаются между словами do и done.
Проверим все на практике и напишем небольшой скрипт, который будет выводить номера от 1 до 5:
Дайте скрипту права на выполнение и запустите его:
chmod +x for1.sh ./for1.sh
Вы увидите, что все выполняется так, как и предполагалось. Программа выведет цифры от 1 до 5, которые мы перечислили в массиве. Вы можете передать циклу любой массив, например, вывод какой-либо другой команды:
Как вы уже поняли, этот цикл выводит список всех, подключенных к системе сетевых интерфейсов. Но в цикле вы можете не только их выводить, но и выполнять какие-либо действия.
Следующий тип цикла for похож на его реализацию в языках программирования Си и С++. Он состоит из трех частей, инициализатора счетчика, условия продолжения выполнения и действия над счетчиком. Вот синтаксис:
for (( счетчик = 1 ; счетчик 10 ; счетчик ++ )) do команда1 команда2 done
Этот цикл немного сложнее, но он позволяет сделать больше. С помощью такого цикла можно не только перебирать массивы, но и сделать необходимое количество повторений. Рассмотрим пример:
Если необходимо, вы можете выйти из цикла преждевременно. Но так делать не рекомендуется. Для выхода используйте команду break:
Со циклами for мы завершили, теперь вы знаете как они выглядят и что с ними делать. Дальше мы рассмотрим циклы while и until. Они намного проще и более универсальны.
Цикл While
Суть цикла While в том, что он будет повторяться до тех пор, пока будет выполняться условие, указанное в объявлении цикла. Здесь нет никаких счетчиков и если они вам нужны, то организовывать их вам придется самим. Bash цикл while имеет такой синтаксис:
while [ условие ] do команда1 команда2 команда3 done
Это работает так: сначала выполняется проверка на правильность условия, если true, выполняется набор команд, затем снова выполняется проверка, и так пока условие не вернет отрицательный результат. Это нам тоже нужно сделать вручную. Рассмотрим пример:
Здесь сначала мы устанавливаем значение счетчика в единицу, затем, в условии сравниваем его с 5, пока счетчик меньше пяти будут выполняться команды из блока do-done. Но еще в этом блоке нам нужно увеличивать значение счетчика на единицу, что мы и делаем.
Также с помощью while мы можем прочитать несколько строк из стандартного ввода:
Программа будет запрашивать новые строки пока вы не передадите ей символ конца файла с помощью сочетания клавиш Ctrl+D. Бесконечный цикл while bash с помощью while еще проще организовать:
while : do echo «Бесконечный цикл bash, для выхода нажмите Ctrl+C» done
Цикл until
Нам осталось рассмотреть последний цикл. Это цикл until. Он очень похож на while и отличается от него только работой условия. Если в первом нужно чтобы условие всегда было истинным, то здесь все наоборот. Цикл будет выполняться пока условие неверно. Синтаксис:
until [ условие ] do команда1 команда2 done
Думаю после рассмотрения реального примера со счетчиком будет намного понятнее как это работает:
Мы задаем значение счетчика 1 и увеличиваем его на единицу при каждом проходе. Как только условие счетчик больше 10 выполнится, сразу цикл будет остановлен. В циклах while и until тоже можно использовать команды break и continue для выхода из цикла и завершения текущего прохода, но мы не будем это очень подробно рассматривать.
Выводы
В этой статье мы рассмотрели циклы Bash, как с ними работать и в каких ситуациях их можно использовать. Циклы могут стать отличным и незаменимым инструментом при создании сложных скриптов администрирования системы. Если у вас остались вопросы, спрашивайте в комментариях!
Основы BASH. Часть 2
Основы BASH. Часть 2. Извиняюсь за такую большую задержку между статьями, но сессия дает о себе знать в самый неподходящий момент 🙂 Всем спасибо за замечания, критику и дополнения, которые были озвучены в комментариях к прошлой статье. Эта часть, как и обещал, будет посвящена циклам, математическим операциям и использованию внешних команд. Начнем.
Циклы. Цикл for-in.
Циклы. Цикл while.
echo «Do you wish to continue?» read again done echo «Bye-Bye»
Как видим цикл выполняется до тех пор, пока мы не введем что-то отличное от «yes». Между do и done можно описывать любые структуры, операторы и т.п., все они будут выполнятся в цикле.Но следует быть осторожным с этим циклом, если вы запустите на выполнение в нём какую-либо команду, без изменения переменной выражения, вы можете попасть в бесконечный цикл. Теперь об условии истинности. После while, как и в условном операторе if-then-else можно вставлять любое выражение или команду, которая возвращает код возврата, и цикл будет исполнятся до тех пор, пока код возврата = 0! Оператор «[» аналог команды test, которая проверяет истинность условия, которое ей передали.
Рассмотрим еще один пример, я взял его из книги Advanced Bash Scripting. Уж очень он мне понравился :), но я его немного упростил. В этом примере мы познакомимся с еще одним типом циклов UNTIL-DO. Эта практически полный аналог цикла WHILE-DO, только выполняется пока какое-то выражение ложно. Вот пример:
dnd=$dividend #мы будем изменять переменные dividend и divisor, #сохраним их знания в других переменных, т.к. они нам #понадобятся dvs=$divisor remainder=1
Математические операции
#!/bin/bash echo «Введите a: » read a echo «Введите b: » read b
Работа с внешними программами при написании shell-скриптов
Перенаправление потоков.
В bash(как и многих других оболочках) есть встроенные файловые дескрипторы: 0 (stdin), 1 (stdout), 2 (stderr). stdout — Стандартный вывод. Сюда попадает все что выводят программы stdin — Стандартный ввод. Это все что набирает юзер в консоли stderr — Стандартный вывод ошибок. Для операций с этими дескрипторами, существуют специальные символы: > (перенаправление вывода), /dev/null
символ «&» означает указатель на дескриптор 1(stdout) (Поумолчанию stderr пишет на ту консоль, в котрой работает пользователь(вренее пишет на дисплей)).
2.Конвееры.
Чаще всего скрипты на Bash используются в качестве автоматизации каких-то рутинных операций в консоли, отсюда иногда возникает необходимость в обработке stdout одной команды и передача на stdin другой команде, при этом результат выполнения одной команды должен быть неким образом обработан. В этом разделе я постораюсь объяснить основные принципы работы с внешними командами внутри скрипта. Думаю что примеров я привел достаточно и можно теперь писать только основные моменты.
1. Передача вывода в переменную.
Как видно, все не сложно, достаточно понять принцип и написать пару своих скриптов. В заключении статьи хочу пожелать удачи в изучении BASH и Linux в целом. Критика, как водится приветствуется. Следующая статья возможно будет посвещена использованию таких программ как sed, awk.