Цель урока: Научить наши скрипты "думать" и принимать решения. Мы изучим, как работает фундаментальная логическая конструкция if-else, научимся проверять различные условия (существование файлов, сравнение чисел и строк) и направлять выполнение скрипта по разным веткам в зависимости от результата этих проверок.

Часть 1: Теория. Как команды сообщают об успехе или неудаче?

Чтобы понять, как работает if, нам нужно сначала понять, как любая команда в Linux сообщает системе о результате своей работы. Это очень простая и элегантная концепция.

После своего завершения каждая программа возвращает системе число - код завершения (exit code).

  • Если программа завершилась успешно, она возвращает 0.

  • Если во время работы произошла ошибка, она возвращает любое число, отличное от 0 (1, 2, 127 и т.д.).

Вы можете сами это увидеть. Введите в терминал команду, которая точно сработает:

ls /etc

А теперь сразу после нее введите специальную команду echo $?, которая выводит код завершения последней выполненной команды:

echo $?
# Вывод будет: 0 (означает "успех")

Теперь попробуем выполнить команду, которая заведомо провалится:

ls /nonexistent_directory
# Вы увидите сообщение об ошибке

И снова проверим код завершения:

echo $?
# Вывод будет числом, отличным от 0 (например, 2), что означает "ошибка"

Конструкция if в Bash делает ровно одну вещь: она выполняет команду и смотрит на ее код завершения. Если код равен 0 (успех), выполняется один блок кода. Если нет - другой.

Часть 2: Практика. Команда test и волшебные скобки [ ... ]

Но как нам проверять условия вроде "число А больше числа Б" или "файл Х существует"? Для этого есть специальная, встроенная в Bash команда - test. Она ничего не выводит на экран, а только возвращает код завершения 0 (успех), если условие истинно, и 1 (ошибка), если оно ложно.

У команды test есть более удобный и читаемый псевдоним - [. То есть, команда test -f /etc/hosts и команда [ -f /etc/hosts ] - это абсолютно одно и то же.

ВАЖНО: Так как [ - это программа (или ее аналог), то пробелы вокруг нее и внутри нее - обязательны! [ -f file ] - правильно. [-f file] - НЕПРАВИЛЬНО и вызовет ошибку.

Вот основные проверки, которые мы будем использовать:

Проверки файлов и каталогов:

  • [ -e /путь/к/файлу ] - истина, если файл или каталог существует (exists).

  • [ -f /путь/к/файлу ] - истина, если это обычный файл (file).

  • [ -d /путь/к/каталогу ] - истина, если это каталог (directory).

Сравнение строк:

  • [ "$VAR1" = "$VAR2" ] - истина, если строки равны. (Один знак =).

  • [ "$VAR1" != "$VAR2" ] - истина, если строки не равны.

  • [ -z "$VAR" ] - истина, если строка пустая (zero length).

Сравнение целых чисел:

  • [ $NUM1 -eq $NUM2 ] - равно (equal).

  • [ $NUM1 -ne $NUM2 ] - не равно (not equal).

  • [ $NUM1 -gt $NUM2 ] - больше чем (greater than).

  • [ $NUM1 -lt $NUM2 ] - меньше чем (less than).

  • [ $NUM1 -ge $NUM2 ] - больше или равно (greater or equal).

  • [ $NUM1 -le $NUM2 ] - меньше или равно (less or equal).

Часть 3: Синтаксис ifelse и elif

1. Простейшая конструкция if

Она выполняет блок кода, только если условие истинно.

Синтаксис:

if [ условие ]
then
    # Команды, которые выполнятся, если условие истинно
fi
  • if - начинает блок.

  • then - "тогда". Обязательное слово после условия.

  • fi - (if наоборот) - закрывает весь блок if. Обязательно.

Пример: Скрипт check_root.sh, который проверяет, запущен ли он от имени root.

Напоминаем что урок по работе со скриптами (создание, запуск и т.д.) находится в - УРОКЕ НОМЕР 12.

Так что обязательно вернитесь в предыдущий урок и освежите навыки, если не уверены в своих действиях.

#!/bin/bash

# Проверяем ID текущего пользователя. У root он всегда равен 0.
# Переменная $EUID хранит ID текущего пользователя.

if [ "$EUID" -eq 0 ]
then
    echo "Скрипт запущен от имени root. Отлично!"
fi

2. Конструкция if-else

Позволяет выполнить один блок кода, если условие истинно, и другой - если оно ложно.

Синтаксис:

if [ условие ]
then
    # Команды для истинного условия
else
    # Команды для ложного условия
fi

Пример: Улучшим наш скрипт check_root.sh.

#!/bin/bash

# Проверяем ID текущего пользователя. У root он всегда равен 0.

if [ "$EUID" -eq 0 ]
then
    echo "Скрипт запущен от имени root. Продолжаем работу."
else
    echo "Ошибка: скрипт должен быть запущен от имени root!"
    echo "Пожалуйста, используйте 'sudo ./check_root.sh'"
fi

3. Конструкция if-elif-else

Для проверки нескольких условий по очереди.

Синтаксис:

if [ условие_1 ]
then
    # Команды для условия_1
elif [ условие_2 ]
then
    # Команды для условия_2
else
    # Команды, если ни одно условие не подошло
fi

Пример: Скрипт guess_number.sh, который "угадывает" число, переданное как аргумент.

#!/bin/bash

# Получаем число из первого аргумента, который передали скрипту
NUMBER=$1
MY_NUMBER=10

echo "Вы ввели число: $NUMBER"

if [ "$NUMBER" -gt "$MY_NUMBER" ]
then
    echo "Это число больше моего."
elif [ "$NUMBER" -lt "$MY_NUMBER" ]
then
    echo "Это число меньше моего."
else
    echo "Вау! Вы угадали мое число!"
fi

Как запустить:
./guess_number.sh 7
./guess_number.sh 15
./guess_number.sh 10

Итоги урока и домашнее задание

  • Что мы освоили:

    • Принцип работы кодов завершения (0 = успех, не 0 = ошибка).

    • Как конструкция if использует коды завершения для принятия решений.

    • Назначение команды test и ее псевдонима [ ... ].

    • Важнейшее правило: обязательные пробелы внутри [ ... ].

    • Три основные формы условного оператора: ifif-else и if-elif-else.

    • Как проводить базовые проверки файлов, строк и чисел.

  • Ваше тринадцатое задание:
    Ваша задача - написать скрипт check_nginx.sh, который будет проверять, установлен ли на сервере веб-сервер Nginx. Мы будем считать, что если существует каталог /etc/nginx, то Nginx установлен.

    Требования к скрипту:

    1. Создайте файл check_nginx.sh в вашей папке ~/scripts.

    2. Не забудьте про шебанг #!/bin/bash в первой строке.

    3. Используйте конструкцию if-else для проверки.

    4. Условием для if должна быть проверка на существование каталога /etc/nginx. Используйте для этого ключ -d.

    5. Если каталог существует, скрипт должен вывести на экран сообщение: "Nginx установлен в системе."

    6. Если каталог не существует, скрипт должен вывести: "Nginx не найден."

    7. Сделайте скрипт исполняемым с помощью команды chmod +x.

    8. Запустите скрипт и проверьте его работу. Затем установите Nginx (apt install nginx), запустите скрипт еще раз и посмотрите, как изменился его вывод. После этого можете удалить Nginx (apt purge nginx).

На следующем уроке мы изучим циклы (for и while), которые позволят нашим скриптам выполнять повторяющиеся действия, например, обрабатывать список файлов или работать до тех пор, пока не будет выполнено определенное условие.

Перейти к просмотру - УРОК №14.

подарок Промо-код: PROMO15 - скидка 15%! огонь

Введите при оформлении первого заказа на сайте: Hosting-VDS.com

авторское право цифровые решения

Помог ли вам данный ответ? 0 Пользователи считают это полезным (0 голосов)