Циклы for, while, until в Bash

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

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

В сценариях Bash есть три основных структуры цикла, которые мы рассмотрим ниже. Существует также несколько инструкций, которые мы можем использовать для управления работой циклов.

Цикл While

Один из самых простых циклов для работы это while.

while [ <some test> ]
do
<commands>
done

В приведенном ниже примере мы напечатаем цифры от 1 до 10:

while_loop.sh

#!/bin/bash
# Базовый цикл while

counter=1
while [ $counter -le 10 ]
do
echo $counter
((counter++))
done

echo All done

Давайте разберем это:

  • Строка 4 - Мы инициализируем счетчик переменных с его начальным значением.
  • Строка 5 - пока тест верен (счетчик меньше или равен 10), давайте сделаем следующие команды.
  • Строка 7 - Мы можем размещать любые команды, которые нам нравятся. Здесь используется эхо , поскольку это простой способ проиллюстрировать, что происходит.
  • Строка 8 - Используя двойные скобки, мы можем увеличить значение счетчика на 1.
  • Строка 9 - Мы находимся в нижней части цикла, поэтому возвращаемся к строке 5 и снова выполняем тест. Если тест верен, выполните команды. Если тест является ложным , то продолжить выполнение каких - либо команд следующее сделано .

Цикл Until

Цикл until довольно похож на цикл while. Разница в том, что он будет выполнять команды внутри него, пока тест не станет истинным.

 Пример:until_loop.sh

#!/bin/bash
# Basic until loop

counter=1
until [ $counter -gt 10 ]
do
echo $counter
((counter++))
done

echo All done

Цикл For

Цикл for немного отличается от предыдущих двух циклов. Что он делает, скажем, для каждого из элементов в данном списке, выполните заданный набор команд. Он имеет следующий синтаксис.

for var in <list>
do
<commands>
done

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

Список определяется как ряд строк, разделенных пробелами.

Вот простой пример для иллюстрации:

#!/bin/bash
# Basic for loop

names='Stan Kyle Cartman'

for name in $names
do
echo $name
done

echo All done

Давайте разберем это:

  • Строка 4 - Создайте простой список, который представляет собой серию имен.
  • Строка 6 - для каждого из элементов в списке $ names присваивает элемент переменной $ name и выполняет следующие команды.
  • Строка 8 - эхо-имя на экране, чтобы показать, что механизм работает. У нас может быть столько команд, сколько нам нравится.
  • Строка 11 - повторите еще одну команду, чтобы показать, что скрипт bash продолжал выполнение как обычно после обработки всех элементов в списке.

Управление циклами: перерыв и продолжение

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

Break

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

copy_files.sh

#!/bin/bash
# Сделайте резервный набор файлов
for value in $1/*
do
used=$( df $1 | tail -1 | awk '{ print $5 }' | sed 's/%//' )
if [ $used -gt 90 ]
then
echo Low disk space 1>&2
break
fi
cp $value $1/backup/
done

Continue

Оператор continue говорит Bash прекратить выполнение этой итерации цикла и начать следующую итерацию. Иногда есть обстоятельства, которые мешают нам идти дальше. Например, возможно, мы используем цикл для обработки ряда файлов, но если мы получим файл, который у нас не имеет разрешения на чтение, мы не должны пытаться его обрабатывать.

copy_check.sh

#!/bin/bash
# Сделайте резервный набор файлов

for value in $1/*
do
if [ ! -r $value ]
then
echo $value not readable 1>&2
continue
fi
cp $value $1/backup/
done

Select

Механизм select позволяет вам создать простую систему меню. Он имеет следующий формат:

select var in <list>
do
<commands>
done

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

Несколько замечаний:

  • Проверка ошибок не выполняется. Если пользователь вводит нечто, отличное от числа или числа, не соответствующего элементу, тогда var становится null (пустой)
  • Если пользователь нажимает кнопку ввода без ввода каких-либо данных, список параметров будет отображаться снова.
  • Цикл завершится, когда будет введен сигнал EOF или выдается оператор break.
  • Вы можете изменить системную переменную PS3, чтобы изменить отображаемое приглашение.

Вот простой пример, иллюстрирующий его использование:

select_example.sh

#!/bin/bash
# A simple menu system

names='Kyle Cartman Stan Quit'

PS3='Select character: '

select name in $names
do
if [ $name == 'Quit' ]
then
break
fi
echo Hello $name
done

echo Bye

Давайте разберем это:

  • Строка 4 - настройка переменной со списком символов и последней опцией, которую мы можем выбрать для выхода. Обратите внимание, что элементы разделяются пробелом.
  • Строка 6 - Измените значение системной переменной PS3 так, чтобы в подсказке было что-то более подробное описание. (По умолчанию это #?)
  • Строки 10 - 13 - Если последний вариант, «Break», выбирается затем break из select цикла.
  • Строка 14 - Распечатайте сообщение, чтобы продемонстрировать, что механизм работал. У вас может быть так много команд здесь, как вам нравится.
  • Строка 17 - Распечатайте сообщение, чтобы показать, что сценарий продолжался как обычно после цикла выбора.

И теперь давайте запустим скрипт Bash:

 

Часть 5. If, else, case в Bash
Часть 7. Функции в Bash

Источник: https://ryanstutorials.net/bash-scripting-tutorial/bash-loops.php

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector