JavaRush /Курсы /Docker SELF /Условия (`if`, `else`) и циклы (`for`, `while`) в bash

Условия (`if`, `else`) и циклы (`for`, `while`) в bash

Docker SELF
3 уровень , 4 лекция
Открыта

1. Условия в bash: if, else, и немного магии

Для чего нужны условия?

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

Основной синтаксис

Вот как выглядит классическое условие if в bash:

if [ условие ]; then
    # Здесь выполняется код, если условие истинно
    echo "Условие выполнено!"
else
    # Здесь выполняется код, если условие ложно
    echo "Условие не выполнено!"
fi

Ключевые слова:

  • if, then, else, и fi (закрывающий блок if) — это магические слова. Без них скрипт работать не будет.
  • Квадратные скобки [ ... ] используются для проверки условий.

Пример 1: Проверка существования файла

#!/bin/bash

FILE="/etc/passwd"

if [ -f $FILE ]; then
    echo "Файл $FILE существует."
else
    echo "Файл $FILE не найден."
fi

Объяснение:

  • -f проверяет, существует ли файл.
  • Если файл существует, команда echo выводит сообщение об этом. Если нет, выполняется блок else.

Условия с командами

Вы можете использовать результат выполнения команды как условие, ведь в Linux всё — это команда.

Пример 2: Проверка доступности сайта

#!/bin/bash

if ping -c 1 example.com &> /dev/null; then
    echo "Сайт доступен."
else
    echo "Сайт недоступен."
fi

Объяснение:

  • ping -c 1 отправляет один запрос к серверу. Если он отвечает, условие становится истинным.
  • &> /dev/null скрывает вывод команды, чтобы не загромождать терминал.

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

Иногда недостаточно просто if и else. Нужно учесть несколько условий. Здесь приходит на помощь elif.

Пример 3: Определение времени суток

#!/bin/bash

HOUR=$(date +%H)

if [ $HOUR -lt 12 ]; then
    echo "Доброе утро!"
elif [ $HOUR -lt 18 ]; then
    echo "Добрый день!"
else
    echo "Добрый вечер!"
fi

Объяснение:

  • date +%H возвращает текущий час в 24-часовом формате.
  • Мы сравниваем текущее время с фиксированными значениями: если меньше 12 — утро, меньше 18 — день, иначе — вечер.

2. Циклы в bash: повторение — мать учения

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

Цикл for

for проходит по списку значений (например, файлы или числа) и выполняет указанное действие для каждого из них.

Пример 4: Простой цикл for

#!/bin/bash

for i in {1..5}; do
    echo "Это итерация номер $i"
done

Объяснение:

  • {1..5} — список чисел от 1 до 5.
  • На каждой итерации переменная i принимает значение из списка.

Пример 5: Перебор файлов в директории

#!/bin/bash

for FILE in /etc/*; do
    echo "Обрабатывается файл: $FILE"
done

Объяснение:

  • /etc/* — это список всех файлов в папке /etc.
  • На каждой итерации переменная FILE содержит имя одного файла.

Цикл while

while выполняет действия, пока выполняется условие.

Пример 6: Угадай число

#!/bin/bash

SECRET=5
GUESS=0

while [ $GUESS -ne $SECRET ]; do
    echo "Введите ваше предположение (число от 1 до 10):"
    read GUESS
done

echo "Вы угадали!"

Объяснение:

  • [ $GUESS -ne $SECRET ] — условие продолжается, пока вводимое число GUESS не равно секретному SECRET.

Комбинируем циклы и условия

Иногда условия и циклы работают сообща.

Пример 7: Проверка нескольких сайтов

#!/bin/bash

SITES=("example.com" "google.com" "nonexistent.website")

for SITE in ${SITES[@]}; do
    if ping -c 1 $SITE &> /dev/null; then
        echo "$SITE доступен."
    else
        echo "$SITE недоступен."
    fi
done

Объяснение:

  • Массив SITES содержит список сайтов.
  • for проходит по каждому сайту из массива.
  • if проверяет доступность сайта с помощью ping.

3. Практические упражнения

Проверка домена

Напишите скрипт, который принимает доменное имя в качестве аргумента и проверяет его доступность.

Подсказка:

if ping -c 1 $1 &> /dev/null; then
    echo "Домен доступен."
else
    echo "Домен недоступен."
fi

Работа с файлами

Напишите скрипт, который проверяет существование нескольких файлов и выводит результат для каждого из них.

Подсказка:

FILES=("file1.txt" "file2.txt" "/etc/passwd")
for FILE in ${FILES[@]}; do
    if [ -f $FILE ]; then
        echo "$FILE существует."
    else
        echo "$FILE не найден."
    fi
done

Таблица умножения

Напишите скрипт с вложенными циклами, который выводит таблицу умножения для чисел от 1 до 10.

Подсказка:

for i in {1..10}; do
    for j in {1..10}; do
        echo -n "$((i * j)) "
    done
    echo ""
done

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

1
Задача
Docker SELF, 3 уровень, 4 лекция
Недоступна
Проверка существования файла
Проверка существования файла
1
Задача
Docker SELF, 3 уровень, 4 лекция
Недоступна
Таблица чисел
Таблица чисел
1
Задача
Docker SELF, 3 уровень, 4 лекция
Недоступна
Чётные и нечётные числа
Чётные и нечётные числа
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
milyasow Уровень 3
20 ноября 2025

...ведь в Linux всё — это команда.
в Linux всё — это файл.
Slevin Уровень 3
24 сентября 2025
В задаче "Чётные и нечётные числа" некорректно описано условие, как именно должен выводиться результат четности\нечетности. Ваше ведро с гвоздями доколупалось на отсутствие ТИРЕ между числом и значением
Anonymous #3268884 Уровень 24
30 марта 2025
Что означает &>
Алексей Уровень 4
5 апреля 2025
Выполнить команду в фоновом режиме и направить поток вывода в файл.
Anonymous #3268884 Уровень 24
8 апреля 2025
Спасибо! Про значок > это я знал, что он показывает, куда направить вывод команды. Меня озадачил значок &. Вроде бы, насколько я понял, он означает, что направлять надо оба потока - и поток вывода данных и поток вывода ошибок.