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

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

Введение

В этой лабораторной работе вы научитесь использовать циклы в 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

## Loop through an array of names
echo "Looping through an array:"
NAMES=("Alice" "Bob" "Charlie" "David")
for name in "${NAMES[@]}"; do
  echo "Hello, $name!"
done

echo ## Print an empty line for readability

## Loop through a range of numbers
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

## Simple countdown using a while loop
count=5
echo "Countdown:"
while [ $count -gt 0 ]; do
  echo $count
  count=$((count - 1))
  sleep 1 ## Wait for 1 second
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

## Count up to 5 using an until loop
count=1
echo "Counting up to 5:"
until [ $count -gt 5 ]; do
  echo $count
  count=$((count + 1))
  sleep 1 ## Wait for 1 second
done

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

  1. Мы устанавливаем начальное значение count=1.
  2. Условие [ $count -gt 5 ] означает «пока count не станет больше 5».
  3. Внутри цикла мы выводим текущее число, увеличиваем его на 1 и ждем секунду.
  4. Цикл работает до тех пор, пока значение не превысит 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

## Using break to exit a loop early
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 ## Print an empty line for readability

## Using continue to skip iterations
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, которые дают вам полный контроль над поведением циклов.

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