bash цикл по параметрам

for цикл в Bash

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

В этом руководстве мы рассмотрим основы циклов 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, только выполняется пока какое-то выражение ложно.
Вот пример:

#!/bin/bash
echo «Введите числитель: »
read dividend
echo «Введите знаменатель: »
read divisor

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.

Источник

Читайте также:  основные функции спинного мозга является
Образовательный портал