Циклы в скриптах Bash

ShellShellBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии (LabEx) вы научитесь использовать циклы в скриптах Bash. Циклы - это мощные инструменты, которые позволяют повторять набор инструкций несколько раз, делая ваши скрипты более эффективными и гибкими. Мы рассмотрим три типа циклов: for, while и until. Кроме того, вы познакомитесь с операторами break и continue, которые обеспечивают контроль над выполнением циклов. Это лабораторное занятие предназначено для начинающих и шаг за шагом приведет вас к пониманию каждого концепта.

Настройка среды

Начнем с настройки нашей рабочей среды. Мы создадим новую директорию для хранения всех наших экспериментов с циклами.

Откройте терминал в WebIDE. По умолчанию вы должны находиться в директории /home/labex/project. Если вы не уверены, вы всегда можете перейти в эту директорию с помощью следующей команды:

cd /home/labex/project

Теперь создадим новую директорию для наших экспериментов с циклами:

mkdir bash_loops
cd bash_loops

Эта команда создает новую директорию с именем bash_loops и переходит в нее. Мы будем использовать эту директорию для всех наших экспериментов с циклами.

Зачем мы это делаем? Организация своих скриптов по директориям - хорошая практика. Это делает вашу работу более организованной и упрощает поиск и управление файлами.

Цикл for

Цикл for используется для перебора списка значений. Это похоже на то, чтобы сказать: "Для каждого элемента в этом списке выполнить какое-то действие". Создадим скрипт, который демонстрирует, как использовать цикл for.

Создайте новый файл с именем for_loop.sh в директории bash_loops:

touch for_loop.sh

Теперь откройте файл for_loop.sh в WebIDE и добавьте следующее содержимое:

#!/bin/bash

## Цикл по массиву имен
echo "Looping through an array:"
NAMES=("Alice" "Bob" "Charlie" "David")
for name in "${NAMES[@]}"; do
  echo "Hello, $name!"
done

echo ## Вывести пустую строку для удобства чтения

## Цикл по диапазону чисел
echo "Looping through a range of numbers:"
for i in {1..5}; do
  echo "Number: $i"
done

Разберем, что делает этот скрипт:

  1. Первый цикл проходит по массиву имен. Для каждого имени в массиве выводится приветствие.
  2. Второй цикл использует диапазон {1..5} для подсчета от 1 до 5.

Синтаксис "${NAMES[@]}" может показаться странным. Символ @ означает "все элементы массива", а кавычки и фигурные скобки гарантируют, что каждый элемент обрабатывается как отдельный элемент, даже если он содержит пробелы.

Сохраните файл и сделайте его исполняемым с помощью следующей команды:

chmod +x for_loop.sh

Команда chmod +x делает файл исполняемым, то есть вы можете запускать его как программу.

Теперь запустите скрипт:

./for_loop.sh

Вы должны увидеть такой вывод:

Looping through an array:
Hello, Alice!
Hello, Bob!
Hello, Charlie!
Hello, David!

Looping through a range of numbers:
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5

Это демонстрирует, как циклы for могут перебирать как массивы, так и диапазоны чисел.

Цикл while

Цикл while выполняет блок кода, пока указанное условие истинно. Это похоже на то, чтобы сказать: "Пока это условие истинно, продолжай делать это".

Создайте новый файл с именем while_loop.sh:

touch while_loop.sh

Откройте файл while_loop.sh в WebIDE и добавьте следующее содержимое:

#!/bin/bash

## Простой отсчет времени с использованием цикла while
count=5
echo "Countdown:"
while [ $count -gt 0 ]; do
  echo $count
  count=$((count - 1))
  sleep 1 ## Подождать 1 секунду
done
echo "Blast off!"

Разберем этот скрипт:

  1. Мы начинаем с count=5, чтобы установить начальное значение отсчета времени.
  2. Условие [ $count -gt 0 ] означает "пока значение переменной count больше 0".
  3. Внутри цикла мы выводим текущее значение отсчета, уменьшаем его на 1 и ждем одну секунду.
  4. Это продолжается до тех пор, пока значение переменной count не достигнет 0, после чего цикл завершается.

Команда sleep 1 приостанавливает выполнение скрипта на 1 секунду, создавая эффект реального отсчета времени.

Сохраните файл и сделайте его исполняемым:

chmod +x while_loop.sh

Теперь запустите скрипт:

./while_loop.sh

Вы увидите отсчет от 5 до 1 с паузой в одну секунду между каждым числом:

Countdown:
5
4
3
2
1
Blast off!

Это демонстрирует, как цикл while может повторять действие до тех пор, пока условие не станет ложным.

Цикл until

Цикл until похож на цикл while, но с важной разницей: он продолжает выполняться до тех пор, пока указанное условие не станет истинным. Это похоже на то, чтобы сказать: "Продолжай делать это, пока это условие не станет истинным".

Создайте новый файл с именем until_loop.sh:

touch until_loop.sh

Откройте файл until_loop.sh в WebIDE и добавьте следующее содержимое:

#!/bin/bash

## Счет от 1 до 5 с использованием цикла until
count=1
echo "Counting up to 5:"
until [ $count -gt 5 ]; do
  echo $count
  count=$((count + 1))
  sleep 1 ## Подождать 1 секунду
done

Разберем этот скрипт:

  1. Мы начинаем с count = 1 в качестве начального значения.
  2. Условие [ $count -gt 5 ] означает "пока значение переменной count не станет больше 5".
  3. Внутри цикла мы выводим текущее значение счетчика, увеличиваем его на 1 и ждем одну секунду.
  4. Это продолжается до тех пор, пока значение переменной count не станет больше 5, после чего цикл завершается.

Сохраните файл и сделайте его исполняемым:

chmod +x until_loop.sh

Теперь запустите скрипт:

./until_loop.sh

Вы увидите, как выводятся числа от 1 до 5 с паузой в одну секунду между каждым:

Counting up to 5:
1
2
3
4
5

Это демонстрирует, как цикл until может повторять действие до тех пор, пока условие не станет истинным.

Использование операторов break и continue

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

Создайте новый файл с именем break_continue.sh:

touch break_continue.sh

Откройте файл break_continue.sh в WebIDE и добавьте следующее содержимое:

#!/bin/bash

## Использование break для досрочного выхода из цикла
echo "Demonstration of break:"
for i in {1..10}; do
  if [ $i -eq 6 ]; then
    echo "Breaking the loop at $i"
    break
  fi
  echo $i
done

echo ## Вывести пустую строку для удобства чтения

## Использование continue для пропуска итераций
echo "Demonstration of continue (printing odd numbers):"
for i in {1..10}; do
  if [ $((i % 2)) -eq 0 ]; then
    continue
  fi
  echo $i
done

Разберем этот скрипт:

  1. В первом цикле мы используем break для выхода из цикла, когда i равно 6.
  2. Во втором цикле мы используем continue для пропуска четных чисел. Условие $((i % 2)) -eq 0 проверяет, является ли число четным (делится ли оно на 2 без остатка).

Оператор % вычисляет остаток от деления. Таким образом, i % 2 будет равно 0 для четных чисел и 1 для нечетных.

Сохраните файл и сделайте его исполняемым:

chmod +x break_continue.sh

Теперь запустите скрипт:

./break_continue.sh

Вы должны увидеть такой вывод:

Demonstration of break:
1
2
3
4
5
Breaking the loop at 6

Demonstration of continue (printing odd numbers):
1
3
5
7
9

Это демонстрирует, как break может досрочно выйти из цикла, и как continue может пропускать определенные итерации на основе условия.

Резюме

В этом практическом занятии вы узнали о трех типах циклов в скриптах Bash:

  1. Циклы for, которые перебирают список элементов или диапазон чисел.
  2. Циклы while, которые продолжают выполняться, пока условие истинно.
  3. Циклы until, которые продолжают выполняться до тех пор, пока условие не станет истинным.

Вы также узнали об операторах break и continue, которые позволяют вам более точно контролировать выполнение циклов.

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