Bash цикл по директориям

Bash цикл по директориям thumbnail

Bash-скрипты: начало

Bash-скрипты, часть 2: циклы

Bash-скрипты, часть 3: параметры и ключи командной строки

Bash-скрипты, часть 4: ввод и вывод

Bash-скрипты, часть 5: сигналы, фоновые задачи, управление сценариями

Bash-скрипты, часть 6: функции и разработка библиотек

Bash-скрипты, часть 7: sed и обработка текстов

Bash-скрипты, часть 8: язык обработки данных awk

Bash-скрипты, часть 9: регулярные выражения

Bash-скрипты, часть 10: практические примеры

Bash-скрипты, часть 11: expect и автоматизация интерактивных утилит

В прошлый раз мы рассказали об основах программирования для bash. Даже то немногое, что уже разобрано, позволяет всем желающим приступить к автоматизации работы в Linux. В этом материале продолжим рассказ о bash-скриптах, поговорим об управляющих конструкциях, которые позволяют выполнять повторяющиеся действия. Речь идёт о циклах for и while, о методах работы с ними и о практических примерах их применения.

Внимание: в посте спрятана выгода!

Циклы for

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

for var in list do команды done

В каждой итерации цикла в переменную var будет записываться следующее значение из списка list. В первом проходе цикла, таким образом, будет задействовано первое значение из списка. Во втором – второе, и так далее – до тех пор, пока цикл не дойдёт до последнего элемента.

Перебор простых значений

Пожалуй, самый простой пример цикла for в bash-скриптах – это перебор списка простых значений:

#!/bin/bash for var in first second third fourth fifth do echo The $var item done

Ниже показаны результаты работы этого скрипта. Хорошо видно, что в переменную $var последовательно попадают элементы из списка. Происходит так до тех пор, пока цикл не дойдёт до последнего из них.

Простой цикл for

Обратите внимание на то, что переменная $var сохраняет значение при выходе из цикла, её содержимое можно менять, в целом, работать с ней можно как с любой другой переменной.

Перебор сложных значений

В списке, использованном при инициализации цикла for, могут содержаться не только простые строки, состоящие из одного слова, но и целые фразы, в которые входят несколько слов и знаков препинания. Например, всё это может выглядеть так:

#!/bin/bash for var in first “the second” “the third” “I’ll do it” do echo “This is: $var” done

Вот что получится после того, как этот цикл пройдётся по списку. Как видите, результат вполне ожидаем.

Перебор сложных значений

TNW-CUS-FMP – промо-код на 10% скидку на наши услуги, доступен для активации в течение 7 дней”

Инициализация цикла списком, полученным из результатов работы команды

Ещё один способ инициализации цикла for заключается в передаче ему списка, который является результатом работы некоей команды. Тут используется подстановка команд для их исполнения и получения результатов их работы.

#!/bin/bash file=”myfile” for var in $(cat $file) do echo ” $var” done

В этом примере задействована команда cat, которая читает содержимое файла. Полученный список значений передаётся в цикл и выводится на экран. Обратите внимание на то, что в файле, к которому мы обращаемся, содержится список слов, разделённых знаками перевода строки, пробелы при этом не используются.

Цикл, который перебирает содержимое файла

Тут надо учесть, что подобный подход, если ожидается построчная обработка данных, не сработает для файла более сложной структуры, в строках которого может содержаться по несколько слов, разделённых пробелами. Цикл будет обрабатывать отдельные слова, а не строки.

Что, если это совсем не то, что нужно?

Разделители полей

Причина вышеописанной особенности заключается в специальной переменной окружения, которая называется IFS (Internal Field Separator) и позволяет указывать разделители полей. По умолчанию оболочка bash считает разделителями полей следующие символы:

  • Пробел
  • Знак табуляции
  • Знак перевода строки

Если bash встречает в данных любой из этих символов, он считает, что перед ним – следующее самостоятельное значение списка.

Для того, чтобы решить проблему, можно временно изменить переменную среды IFS. Вот как это сделать в bash-скрипте, если исходить из предположения, что в качестве разделителя полей нужен только перевод строки:

IFS=$’n’

После добавления этой команды в bash-скрипт, он будет работать как надо, игнорируя пробелы и знаки табуляции, считая разделителями полей лишь символы перевода строки.

#!/bin/bash file=”/etc/passwd” IFS=$’n’ for var in $(cat $file) do echo ” $var” done

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

Построчный обход содержимого файла в цикле for

Разделителями могут быть и другие символы. Например, выше мы выводили на экран содержимое файла /etc/passwd. Данные о пользователях в строках разделены с помощью двоеточий. Если в цикле нужно обрабатывать подобные строки, IFS можно настроить так:

IFS=:

Обход файлов, содержащихся в директории

Один из самых распространённых вариантов использования циклов for в bash-скриптах заключается в обходе файлов, находящихся в некоей директории, и в обработке этих файлов.

Например, вот как можно вывести список файлов и папок:

#!/bin/bash for file in /home/likegeeks/* do if [ -d “$file” ] then echo “$file is a directory” elif [ -f “$file” ] then echo “$file is a file” fi done

Если вы разобрались с предыдущим материалом из этой серии статей, вам должно быть понятно устройство конструкции if-then, а так же то, как отличить файл от папки. Если вам сложно понять вышеприведённый код, перечитайте этот материал.

Вот что выведет скрипт.

Вывод содержимого папки

Обратите внимание на то, как мы инициализируем цикл, а именно – на подстановочный знак «*» в конце адреса папки. Этот символ можно воспринимать как шаблон, означающий: «все файлы с любыми именами». он позволяет организовать автоматическую подстановку имён файлов, которые соответствуют шаблону.

При проверке условия в операторе if, мы заключаем имя переменной в кавычки. Сделано это потому что имя файла или папки может содержать пробелы.

Циклы for в стиле C

Если вы знакомы с языком программирования C, синтаксис описания bash-циклов for может показаться вам странным, так как привыкли вы, очевидно, к такому описанию циклов:

for (i = 0; i < 10; i++) { f(“number is %dn”, i); }

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

Читайте также:  Земля территория загадок весь цикл

for (( начальное значение переменной ; условие окончания цикла; изменение переменной ))

На bash это можно написать так:

for (( a = 1; a < 10; a++ ))

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

#!/bin/bash for (( i=1; i <= 10; i++ )) do echo “number is $i” done

Этот код выведет список чисел от 1 до 10.

Работа цикла в стиле C

Цикл while

Конструкция for – не единственный способ организации циклов в bash-скриптах. Здесь можно пользоваться и циклами while. В таком цикле можно задать команду проверки некоего условия и выполнять тело цикла до тех пор, пока проверяемое условие возвращает ноль, или сигнал успешного завершения некоей операции. Когда условие цикла вернёт ненулевое значение, что означает ошибку, цикл остановится.

Вот схема организации циклов while

while команда проверки условия

do

другие команды

done

Взглянем на пример скрипта с таким циклом:

#!/bin/bash var1=5 while [ $var1 -gt 0 ] do echo $var1 var1=$[ $var1 – 1 ] done

На входе в цикл проверяется, больше ли нуля переменная $var1. Если это так, выполняется тело цикла, в котором из значения переменной вычитается единица. Так происходит в каждой итерации, при этом мы выводим в консоль значение переменной до его модификации. Как только $var1 примет значение 0, цикл прекращается.

Результат работы цикла while

Если не модифицировать переменную $var1, это приведёт к попаданию скрипта в бесконечный цикл.

Вложенные циклы

В теле цикла можно использовать любые команды, в том числе – запускать другие циклы. Такие конструкции называют вложенными циклами:

#!/bin/bash for (( a = 1; a <= 3; a++ )) do echo “Start $a:” for (( b = 1; b <= 3; b++ )) do echo ” Inner loop: $b” done done

Ниже показано то, что выведет этот скрипт. Как видно, сначала выполняется первая итерация внешнего цикла, потом – три итерации внутреннего, после его завершения снова в дело вступает внешний цикл, потом опять – внутренний.

Вложенные циклы

Обработка содержимого файла

Чаще всего вложенные циклы используют для обработки файлов. Так, внешний цикл занимается перебором строк файла, а внутренний уже работает с каждой строкой. Вот, например, как выглядит обработка файла /etc/passwd:

#!/bin/bash IFS=$’n’ for entry in $(cat /etc/passwd) do echo “Values in $entry -” IFS=: for value in $entry do echo ” $value” done done

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

Обработка данных файла

Такой подход можно использовать при обработке файлов формата CSV, или любых подобных файлов, записывая, по мере надобности, в переменную окружения IFS символ-разделитель.

Управление циклами

Возможно, после входа в цикл, нужно будет остановить его при достижении переменной цикла определённого значения, которое не соответствует изначально заданному условию окончания цикла. Надо ли будет в такой ситуации дожидаться нормального завершения цикла? Нет конечно, и в подобных случаях пригодятся следующие две команды:

  • break
  • continue

Команда break

Эта команда позволяет прервать выполнение цикла. Её можно использовать и для циклов for, и для циклов while:

#!/bin/bash for var1 in 1 2 3 4 5 6 7 8 9 10 do if [ $var1 -eq 5 ] then break fi echo “Number: $var1” done

Такой цикл, в обычных условиях, пройдётся по всему списку значений из списка. Однако, в нашем случае, его выполнение будет прервано, когда переменная $var1 будет равна 5.

Досрочный выход из цикла for

Вот – то же самое, но уже для цикла while:

#!/bin/bash var1=1 while [ $var1 -lt 10 ] do if [ $var1 -eq 5 ] then break fi echo “Iteration: $var1” var1=$(( $var1 + 1 )) done

Команда break, исполненная, когда значение $var1 станет равно 5, прерывает цикл. В консоль выведется то же самое, что и в предыдущем примере.

Команда continue

Когда в теле цикла встречается эта команда, текущая итерация завершается досрочно и начинается следующая, при этом выхода из цикла не происходит. Посмотрим на команду continue в цикле for:

#!/bin/bash for (( var1 = 1; var1 < 15; var1++ )) do if [ $var1 -gt 5 ] && [ $var1 -lt 10 ] then continue fi echo “Iteration number: $var1” done

Когда условие внутри цикла выполняется, то есть, когда $var1 больше 5 и меньше 10, оболочка исполняет команду continue. Это приводит к пропуску оставшихся в теле цикла команд и переходу к следующей итерации.

Команда continue в цикле for

Обработка вывода, выполняемого в цикле

Данные, выводимые в цикле, можно обработать, либо перенаправив вывод, либо передав их в конвейер. Делается это с помощью добавления команд обработки вывода после инструкции done.

Например, вместо того, чтобы показывать на экране то, что выводится в цикле, можно записать всё это в файл или передать ещё куда-нибудь:

#!/bin/bash for (( a = 1; a < 10; a++ )) do echo “Number is $a” done > myfile.txt echo “finished.”

Оболочка создаст файл myfile.txt и перенаправит в этот файл вывод конструкции for. Откроем файл и удостоверимся в том, что он содержит именно то, что ожидается.

Перенаправление вывода цикла в файл

Пример: поиск исполняемых файлов

Давайте воспользуемся тем, что мы уже разобрали, и напишем что-нибудь полезное. Например, если надо выяснить, какие именно исполняемые файлы доступны в системе, можно просканировать все папки, записанные в переменную окружения PATH. Весь арсенал средств, который для этого нужен, у нас уже есть, надо лишь собрать всё это воедино:

#!/bin/bash IFS=: for folder in $PATH do echo “$folder:” for file in $folder/* do if [ -x $file ] then echo ” $file” fi done done

Такой вот скрипт, небольшой и несложный, позволил получить список исполняемых файлов, хранящихся в папках из PATH.

Поиск исполняемых файлов в папках из переменной PATH

Итоги

Сегодня мы поговорили о циклах for и while в bash-скриптах, о том, как их запускать, как ими управлять. Теперь вы умеете обрабатывать в циклах строки с разными разделителями, знаете, как перенаправлять данные, выведенные в циклах, в файлы, как просматривать и анализировать содержимое директорий.

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

Читайте также:  Операционный цикл как расчитать

Уважаемые читатели! В комментариях к предыдущему материалу вы рассказали нам много интересного. Уверены, всё это окажет неоценимую помощь тем, кто хочет научиться программировать для bash. Но тема эта огромна, поэтому снова просим знатоков поделиться опытом, а новичков – впечатлениями.

Источник

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

В языках сценариев, таких как Bash, циклы полезны для автоматизации повторяющихся задач. В Bash доступны три основные конструкции цикла: for, while и until циклы.

В этом руководстве мы рассмотрим основы циклов for в Bash. Мы также покажем вам, как использовать операторы break и continue чтобы изменить ход цикла.

Стандартный for цикл в Bash

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

Цикл for Bash имеет следующую форму:

for item in [LIST] do [COMMANDS] done

Список может быть серией строк, разделенных пробелами, диапазоном чисел, выводом команды, массивом и т. Д.

Оберните струны

В приведенном ниже примере цикл будет перебирать каждый элемент в списке строк, и переменный element будет установлен на текущий элемент:

for element in Hydrogen Helium Lithium Beryllium do echo “Element: $element” done

Цикл выдаст следующий результат:

Element: Hydrogen Element: Helium Element: Lithium Element: Beryllium

Цикл по диапазону чисел

Вы можете использовать выражение последовательности, чтобы указать диапазон чисел или символов, задав начальную и конечную точки диапазона. Выражение последовательности принимает следующую форму:

Вот пример цикла, который перебирает все числа от 0 до 3:

for i in {0..3} do echo “Number: $i” done Number: 0 Number: 1 Number: 2 Number: 3

Начиная с Bash 4, также можно указывать приращение при использовании диапазонов. Выражение принимает следующий вид:

Вот пример, показывающий, как увеличить на 5:

for i in {0..20..5} do echo “Number: $i” done Number: 0 Number: 5 Number: 10 Number: 15 Number: 20

Перебирать элементы массива

Вы также можете использовать цикл for для перебора массива элементов.

В приведенном ниже примере мы определяем массив с именем BOOKS и перебираем каждый элемент массива.

BOOKS=(‘In of Lost ‘ ‘Don Quixote’ ‘Ulysses’ ‘The Great Gatsby’) for book in “${BOOKS[@]}”; do echo “Book: $book” done Book: In of Lost Book: Don Quixote Book: Ulysses Book: The Great Gatsby

Цикл for в Bash в стиле C

Синтаксис цикла for стиле C имеет следующий вид:

for ((INITIALIZATION; TEST; STEP)) do [COMMANDS] done

Часть INITIALIZATION выполняется только один раз при запуске цикла. Затем оценивается TEST . Если это ложь, цикл прекращается. Если TEST истинен, команды внутри цикла for выполняются, а часть STEP обновляется.

В следующем примере кода цикл начинается с инициализации i = 0 и перед каждой итерацией проверяется, является ли i ≤ 10 . Если true, он печатает текущее значение i и [увеличивает переменную] i на 1 ( i++ ), в противном случае цикл завершается.

for ((i = 0 ; i <= 1000 ; i++)); do echo “Counter: $i” done

Цикл повторится 1001 раз и выдаст следующий результат:

Counter: 0 Counter: 1 Counter: 2 … Counter: 998 Counter: 999 Counter: 1000

Операторы break и continue

Операторы break и continue могут использоваться для управления выполнением цикла for.

Оператор break

Оператор break завершает текущий цикл и передает управление программой оператору, следующему за завершенным оператором. Обычно он используется для завершения цикла при выполнении определенного условия.

В следующем примере мы используем оператор if для прекращения выполнения цикла, когда текущий повторяемый элемент становится равным «Lithium».

for element in Hydrogen Helium Lithium Beryllium; do if [[ “$element” == ‘Lithium’ ]]; then break fi echo “Element: $element” done echo ‘All Done!’ Element: Hydrogen Element: Helium All Done!

Оператор continue

Оператор continue завершает текущую итерацию цикла и передает управление программой следующей итерации цикла.

В следующем примере мы перебираем диапазон чисел. Когда текущий повторяемый элемент равен ‘2’, оператор continue заставит выполнение вернуться к началу цикла и продолжить следующую итерацию:

for i in {1..5}; do if [[ “$i” == ‘2’ ]]; then continue fi echo “Number: $i” done Number: 1 Number: 3 Number: 4 Number: 5

Примеров циклов for в Bash

Переименование файлов с пробелами в имени файла

В следующем примере показано, как переименовать все файлы в текущем каталоге с пробелом в его именах, заменив пробел на подчеркивание:

for file in * *; do mv “$file” “${file// /_}” done

Давайте разберем код построчно:

  • Первая строка создает цикл for и выполняет итерацию по списку всех файлов с пробелом в имени. Выражение * * создает список.
  • Вторая строка применяется к каждому элементу списка и перемещает файл в новый, заменяя пробел знаком подчеркивания ( _ ). Часть ${file// /_} использует расширение параметра оболочки для замены шаблона в параметре строкой.
  • done указывает конец сегмента цикла.

Изменение расширения файла

В следующем примере показано, как использовать цикл for в Bash for переименования всех файлов, оканчивающихся на .jpeg, в текущем каталоге путем замены расширения файла с .jpeg на .jpg.

for file in *.jpeg; do mv — “$file” “${file%.jpeg}.jpg” done

Давайте проанализируем код построчно:

  • Первая строка создает цикл for и выполняет итерацию по списку всех файлов, заканчивающихся на ‘.jpeg’.
  • Вторая строка применяется к каждому элементу списка и перемещает файл в новый, заменяя «.jpeg» на «.jpg». ${file%.jpeg} чтобы удалить часть ‘.jpeg’ из имени файла, используя расширение параметра оболочки
  • done указывает конец сегмента цикла.

Выводы

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

vi for1.sh

!/bin/bash

for number in 1 2 3 4 5

do

echo $number

done

Bash цикл по директориям

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

chmod +x for1.sh

./for1.sh

Bash цикл по директориям

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

!/bin/bash

for iface in $(ls /sys/class/net/)

do

echo $iface

done

Bash цикл по директориям

Bash цикл по директориям

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

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

for ((счетчик=1; счетчик < 10; счетчик++))

do

команда1

команда2

done

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

!/bin/bash

for ((i=1; i < 10; i++))

do

echo $i

done

Bash цикл по директориям

Bash цикл по директориям

Результат странный, правда? Обратите внимание, как выполняется проверка условия. Значение счетчика сравнивается с эталоном. Действие с переменной счетчиком выполняется сразу же после завершения основного блока команд, а уже потом делается сравнение. Таким образом, у нас при первом выполнении i равно 1, а после него уже два 2. Теперь к завершению девятого прохода значение счетчика будет увеличено на единицу и станет 10. Условие сравнения 10 < 10 не верно, поэтому цикл дальше не выполняется.

С помощью этого же синтаксиса можно сделать бесконечные циклы bash linux:

!/bin/bash

for ((;;))

do

echo “Бесконечный цикл, нажмите CTRL+C для выхода”

done

Bash цикл по директориям

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

!/bin/bash

for (i=1;i<10;i++)

do

echo Значение счетчика $i

if [[ i -gt 5]]

break

fi

done

Bash цикл по директориям

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

Цикл While

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

while [ условие ]

do

команда1

команда2

команда3

done

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

vi while.sh

!/bin/bash

x=1

while [ $x -lt 5 ]

do

echo “Значение счетчика: $x”

x=$(( $x + 1 ))

done

Bash цикл по директориям

Bash цикл по директориям

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

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

vi while.sh

!/bin/bash

hile read line

do

echo $line

done

Bash цикл по директориямBash цикл по директориям

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

vi while.sh

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

Bash цикл по директориям

Мы задаем значение счетчика 1 и увеличиваем его на единицу при каждом проходе. Как только условие счетчик больше 10 выполнится, сразу цикл будет остановлен. В циклах while и until тоже можно использовать команды break и continue для выхода из цикла и завершения текущего прохода, но мы не будем это очень подробно рассматривать.

Выводы

В этой статье мы рассмотрели циклы Bash, как с ними работать и в каких ситуациях их можно использовать. Циклы могут стать отличным и незаменимым инструментом при создании сложных скриптов администрирования системы. Если у вас остались вопросы, спрашивайте в комментариях!

Источник