Как использовать условные операторы if в Bash с несколькими условиями

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

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

Введение

В этом руководстве вы узнаете, как использовать операторы if в Bash с несколькими условиями, чтобы улучшить свои навыки написания скриптов для оболочки. Вы научитесь эффективно комбинировать логические операторы, что позволит вам создавать скрипты, которые принимают разумные решения на основе различных критериев. По завершении этого практического занятия (Lab) вы сможете создавать универсальные автоматизированные инструменты для повседневных задач.

Понимание основ операторов if в Bash

Начнем с основ. В Bash оператор if позволяет скрипту принимать решения о том, что делать, в зависимости от того, истинно ли или ложно заданное условие. Это особенно полезно, когда вам нужно автоматизировать задачи на вашей системе Ubuntu.

Откройте терминал в каталоге по умолчанию, /home/labex/project. Здесь вы будете писать все свои скрипты. Чтобы начать, создайте простой файл скрипта с именем basic_if.sh, введя следующую команду:

touch basic_if.sh

Добавьте следующий код для проверки существования файла:

#!/bin/bash
if [[ -f "testfile.txt" ]]; then
  echo "The file exists."
else
  echo "The file does not exist."
fi

Этот скрипт использует [[ -f "testfile.txt" ]] для проверки существования файла testfile.txt в текущем каталоге. Команда echo выведет сообщение в зависимости от результата проверки.

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

chmod +x basic_if.sh

Затем выполните его:

./basic_if.sh

Поскольку файл testfile.txt еще не существует, вы увидите сообщение "The file does not exist." Создадим файл, чтобы увидеть другой результат:

touch testfile.txt

Запустите скрипт еще раз:

./basic_if.sh
basic_if.sh

Теперь он должен вывести "The file exists." Этот шаг знакомит вас с базовой структурой: if, then, else и fi. Двойные квадратные скобки [[ ]] - это современная особенность Bash, которая делает проверку условий более надежной, чем использование одинарных скобок.

Добавление нескольких условий с использованием оператора AND (&&)

Теперь давайте сделаем ваш оператор if более умным, проверив сразу несколько условий. Вы будете использовать оператор && (логическое И), который требует, чтобы все условия были истинными, чтобы блок then был выполнен.

Откройте снова файл basic_if.sh и замените его содержимое на следующий обновленный скрипт:

#!/bin/bash
if [[ -f "testfile.txt" ]] && [[ -r "testfile.txt" ]]; then
  echo "The file exists and is readable."
else
  echo "The file is either missing or not readable."
fi

Этот скрипт проверяет два условия: существует ли файл testfile.txt (-f) и можно ли его прочитать (-r). Оба условия должны быть истинными, чтобы появилось первое сообщение.

Запустите скрипт:

./basic_if.sh

Поскольку вы создали файл testfile.txt на первом шаге и он по умолчанию доступен для чтения (так как он принадлежит пользователю labex), вы увидите сообщение "The file exists and is readable." Чтобы понять, как работает оператор &&, давайте проверим обратный сценарий. Измените права доступа к файлу, чтобы он стал недоступным для чтения:

chmod u-r testfile.txt

Запустите скрипт еще раз:

./basic_if.sh

Теперь он выводит сообщение "The file is either missing or not readable", так как второе условие (-r) не выполняется. Восстановите возможность чтения файла для следующих шагов:

chmod u+r testfile.txt

Оператор && гарантирует, что каждое условие должно быть выполнено — это идеально подходит для ситуаций, когда важны несколько критериев.

Использование оператора OR (||) для гибких условий

Далее вы познакомитесь с оператором || (логическое ИЛИ), который позволяет выполнить блок then, если хотя бы одно условие истинно. Это полезно, когда вам нужна гибкость в проверках.

Откройте снова файл basic_if.sh. Обновите его следующим кодом:

#!/bin/bash
if [[ -f "testfile.txt" ]] || [[ -f "backup.txt" ]]; then
  echo "At least one file exists."
else
  echo "Neither file exists."
fi

Этот скрипт проверяет, существует ли либо файл testfile.txt, либо файл backup.txt. Поскольку файл testfile.txt уже находится в вашем каталоге, запустите скрипт:

./basic_if.sh

Вы увидите сообщение "At least one file exists." Теперь удалите файл testfile.txt, чтобы проверить логику оператора ||:

rm testfile.txt

Запустите скрипт еще раз:

./basic_if.sh

Он выводит сообщение "Neither file exists", так как ни один из файлов не существует. Создайте файл backup.txt, чтобы увидеть, как условие ИЛИ выполняется:

touch backup.txt
./basic_if.sh

Теперь снова выводится сообщение "At least one file exists". Оператор || очень полезен, когда достаточно, чтобы хотя бы одно условие было истинным.

Комбинирование операторов AND и OR

Давайте объединим операторы && и || для создания более сложной логики. Вы будете проверять, существует ли файл и соответствует ли он определенным критериям, с запасным условием.

Откройте снова файл basic_if.sh. Обновите его следующим кодом:

#!/bin/bash
if [[ -f "testfile.txt" ]] && [[ -r "testfile.txt" ]] || [[ -f "backup.txt" ]]; then
  echo "Either testfile.txt is readable or backup.txt exists."
else
  echo "No suitable file found."
fi

Этот скрипт проверяет, существует ли файл testfile.txt и доступен ли он для чтения, или существует ли файл backup.txt. Создайте файл testfile.txt снова:

touch testfile.txt

Запустите скрипт:

./basic_if.sh

Он выводит сообщение "Either testfile.txt is readable or backup.txt exists", так как файл testfile.txt удовлетворяет обоим условиям. Удалите файл testfile.txt и оставьте файл backup.txt:

rm testfile.txt
./basic_if.sh

Появляется то же самое сообщение, так как файл backup.txt удовлетворяет условию ||. Удалите также файл backup.txt:

rm backup.txt
./basic_if.sh

Теперь выводится сообщение "No suitable file found." Этот шаг показывает, как комбинировать операторы для принятия тонких решений.

Применение условий к практической задаче

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

Создайте новый скрипт с именем number_check.sh:

touch number_check.sh
chmod +x number_check.sh

Добавьте следующий код:

#!/bin/bash
read -p "Enter a number between 1 and 10: " number
if [[ "$number" -ge 1 ]] && [[ "$number" -le 10 ]]; then
  echo "Valid number: $number"
else
  echo "Invalid number. Please enter a value between 1 and 10."
fi

Этот скрипт предлагает вам ввести число, а затем использует оператор &&, чтобы убедиться, что оно находится в диапазоне от 1 до 10 (включительно). Запустите его:

./number_check.sh

Введите 5 и нажмите Enter. Вы увидите сообщение "Valid number: 5". Запустите скрипт еще раз и введите 15. Он ответит "Invalid number. Please enter a value between 1 and 10." Это практический способ обработки пользовательского ввода, гарантирующий, что ваш скрипт будет работать только с корректными данными.

Резюме

В этом практическом занятии вы освоили использование операторов && и || для создания условных операторов if с несколькими условиями в языке Bash. От проверки свойств файлов до валидации пользовательского ввода, вы написали скрипты, которые принимают решения на основе сложных критериев. Эти навыки позволяют вам создавать надежные автоматизированные инструменты, адаптированные к различным потребностям на вашей системе Ubuntu.