Unix / Linux - Управление циклами

Здравствуйте, будущие программисты! Сегодня мы окунемся в захватывающий мир управления циклами в скриптах shell Unix и Linux. Как ваш доброжелательный сосед-компьютерный учитель, я здесь, чтобы провести вас через это путешествие, шаг за шагом. Не волнуйтесь, если вы новички в программировании - мы начнем с азов и постепенно поднимемся. Так что возьмите кружку кофе (или чая, если это ваше дело), и давайте начнем цикл!

Unix / Linux - Loop Control

Понимание циклов

Прежде чем перейти к управлению циклами, давайте быстро освежим в памяти, что такое циклы. Представьте, что вам нужно написать "Я люблю программирование" на доске 100 раз. Вместо того чтобы писать это вручную 100 раз, вы можете использовать цикл для автоматизации этой повторяющейся задачи. Именно так и работают циклы в программировании - они позволяют нам выполнять набор команд многократно, не записывая их снова и снова.

Бесконечный цикл

Теперь давайте поговорим о чем-то и fascинирующем, и потенциально опасном: бесконечном цикле. Это как карусель, которая никогда не останавливается - она просто продолжает двигаться и двигаться.

Что такое бесконечный цикл?

Бесконечный цикл - это цикл, который продолжается indefinitely, потому что его условие завершения никогда не выполняется. Хотя это может показаться рецептом катастрофы, на самом деле есть некоторые сценарии, где бесконечные циклы полезны (мы доберемся до этого позже).

Пример бесконечного цикла

Вот простой пример бесконечного цикла в скрипте shell:

#!/bin/bash
while true
do
echo "This is an infinite loop!"
sleep 1
done

В этом скрипте:

  • while true создает условие, которое всегда истинно, поэтому цикл никогда не останавливается.
  • echo выводит наше сообщение.
  • sleep 1暂停 скрипт на 1 секунду перед следующей итерацией.

Если вы запустите этот скрипт, вы увидите "This is an infinite loop!" выводимый каждую секунду, пока вы вручную не остановите скрипт (обычно, нажав Ctrl+C).

Когда мы можем использовать бесконечные циклы?

С трудом верится, но бесконечные циклы не всегда плохи! Они могут быть полезны в таких сценариях, как:

  1. Создание программы, которая должна работать непрерывно (например, сервер).
  2. Реализация системы меню, где пользователь может повторно выбирать опции.
  3. Мониторинг систем для конкретных событий или условий.

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

Оператор break

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

Что делает break?

Оператор break делает exactly то, что вы думаете - он "прерывает" текущий цикл, независимо от того, все еще истинно ли условие цикла.

Пример использования break

Давайте изменим наш предыдущий бесконечный цикл, чтобы он останавливался после 5 итераций:

#!/bin/bash
count=0
while true
do
echo "Loop iteration: $count"
count=$((count + 1))
if [ $count -eq 5 ]
then
echo "Breaking the loop!"
break
fi
sleep 1
done
echo "Loop has ended."

В этом скрипте:

  • Мы�始化 переменную count для отслеживания итераций.
  • Каждая итерация, мы увеличиваем count и проверяем, равен ли он 5.
  • Если count равен 5, мы выводим сообщение и используем break для выхода из цикла.

Когда вы запустите этот скрипт, вы увидите, что он досчитает до 5 и затем остановится.

Оператор continue

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

Что делает continue?

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

Пример использования continue

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

#!/bin/bash
for i in {1..10}
do
if [ $((i % 2)) -eq 0 ]
then
continue
fi
echo $i
done

В этом скрипте:

  • Мы используем цикл for для итерации от 1 до 10.
  • if [ $((i % 2)) -eq 0 ] проверяет, является ли число четным (делится на 2 без остатка).
  • Если число четное, continue пропускает оставшуюся часть текущей итерации.
  • В противном случае, мы выводим число.

Когда вы запустите этот скрипт, вы увидите только нечетные числа: 1, 3, 5, 7, 9.

Все вместе

Теперь, когда мы узнали о бесконечных циклах, break и continue, давайте создадим более сложный пример, который использует все эти концепции:

#!/bin/bash

echo "Welcome to the Number Guessing Game!"
secret_number=$((RANDOM % 10 + 1))
attempts=0

while true
do
read -p "Guess a number between 1 and 10 (or 'q' to quit): " guess

if [ "$guess" = "q" ]
then
echo "Thanks for playing! The secret number was $secret_number."
break
fi

if ! [[ "$guess" =~ ^[0-9]+$ ]]
then
echo "Please enter a valid number or 'q' to quit."
continue
fi

attempts=$((attempts + 1))

if [ "$guess" -eq "$secret_number" ]
then
echo "Congratulations! You guessed the number in $attempts attempts!"
break
elif [ "$guess" -lt "$secret_number" ]
then
echo "Too low! Try again."
else
echo "Too high! Try again."
fi
done

Этот скрипт создает простую игру угадывания чисел, которая демонстрирует:

  • Бесконечный цикл для поддержания работы игры.
  • Использование break для выхода, когда玩家 угадал число или решил выйти.
  • Использование continue для пропуска недопустимых вводов.

Резюме по управлениям циклами

Вот быстрый справочный стол с управлениями циклами, которые мы изучили:

Оператор Описание Сценарий использования
while true Создает бесконечный цикл Когда вам нужно, чтобы цикл работал непрерывно до определенного условия
break Выход из текущего цикла Когда вы хотите остановить цикл на основе определенного условия
continue Пропускает оставшуюся часть текущей итерации Когда вы хотите пропустить оставшуюся часть текущей итерации на основе условия

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

Счастливого кодирования, будущие мастера скриптов shell! Пусть ваши циклы будут бесконечными только тогда, когда вы этого хотите, и пусть ваши операторы break всегда будут под рукой. До свидания, продолжайте учиться и программировать!

Credits: Image by storyset