Поиск по сайту:

Условные операторы Bash

Примеры условных выражений Bash

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

Синтаксис условного оператора

Строительный блок условного оператора в bash выглядит следующим образом.

if [[ conditions ]]
then
   code
elif [[ conditions ]]
then
   code
else
   code
fi

Пояснение кода:

  1. Ключевые слова "if" и "fi" обозначают начало и конец условного оператора. За каждым оператором if должно следовать ключевое слово then.
  2. Для оценки условия следует использовать либо [[ ]], либо [ ]. Если условие оценивается как "True", то блок кода будет выполнен.
  3. Условный оператор может иметь одно условие if и несколько условий elif. Если условие оценивается как истинное, все последующие условные операторы пропускаются.
  4. Если весь блок if или elif оценивается как false, то блок кода из предложения "else".
  5. Хотя строгих правил в отношении отступов нет, оставьте для блока кода 2 пробела, чтобы улучшить читаемость.

Для оценки условий в bash есть встроенная команда "test". Квадратные скобки аналогичны команде тестирования, поэтому вы можете использовать либо команду тестирования, либо квадратные скобки.

$ type -a test
test is a shell builtin
test is /usr/bin/test
test is /bin/test

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

man test
help test

Операторы проверки файлов

Операторы проверки файлов можно использовать для работы с объектами файлов или каталогов. Используя операторы проверки файлов, вы можете проверить, присутствует или нет данный файл или каталог, является ли данный объект файлом или каталогом, с каким типом файла вы имеете дело, размер файла и т. д. Запустите следующую команду и найдите раздел файлового оператора.

man test

Оператор проверки файла

Не все операторы используются часто, но я расскажу вам о самых важных.

Чтобы проверить, присутствует ли данный файл или нет, используйте флаг -e. Здесь я проверяю, присутствует ли файл .bashrc в моем домашнем каталоге или нет.

if [[ -e /home/${USER}/.bashrc ]]
then
  echo "File is present"
else
  echo "File is not present"
fi

Проверьте, существует ли файл или нет

Чтобы проверить, присутствует ли данный каталог или нет, используйте флаг -d. Здесь я проверяю наличие каталога рабочий стол в своей домашней папке.

if [[ -d ~/Desktop/ ]]
then
  echo "Directory is present"
else
  echo "Directory is not present"
fi

Проверьте, существует ли каталог или нет

Чтобы проверить, является ли файл файлом ненулевого размера, используйте флаг -s. Здесь я создал файл с именем "zero_byte.txt" и добавил некоторый текст.

touch ~/Desktop/zero_byte.txt
echo "Writing something" >> ~/Desktop/zero_byte.txt
if [[ -s ~/Desktop/zero_byte.txt ]]
then
  echo "File is not zero byte"
else
  echo "File is zero byte"
fi

Проверьте, имеет ли файл нулевые байты или нет.

Вы можете использовать символ ! с любыми флагами, которые инвертируют результат. Я использую тот же пример, что и выше, но с символом "!". Он инвертирует и распечатает файл как файл с нулевым байтом, даже если это не так.

if [[ ! -s ~/Desktop/zero_byte.txt ]]
then
  echo "File is not zero byte"
else
  echo "File is zero byte"
fi

Обратные операции

Операторы целочисленного сравнения

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

-eq => Integer X is equal to Integer Y
-ne => Integer X is not equal to Integer Y
-gt => Integer X is greater than Integer Y
-ge => Integer X is greater than or equal to Integer Y
-lt => Integer X is lesser than Integer Y
-le => Integer X is lesser than or equal to Integer Y

Каждая команда bash возвращает код выхода в диапазоне 0–255, и мы будем использовать операторы целочисленного сравнения для оценки кодов выхода. В приведенном ниже примере я присваиваю код завершения команды nvim переменной с именем EXCODE и выполняю целочисленное сравнение. Поскольку neovim недоступен, он выдаст код выхода 127 (ошибка «команда не найдена»).

EXCODE=$(nvim;echo $?)
if [[ $EXCODE -eq 0 ]]
then      
  echo "nvim is available to use"
elif [[ $EXCODE -eq 127 ]]
then
  echo "Command not found, check if nvim is installed or not"
else     
   echo "Return code is other than 0 & 127. Check and fix the error"
fi

Пример целочисленного сравнения

В приведенном выше примере я использовал оператор elif в качестве первого оператора этой статьи. Сначала оценивается условие "if", чтобы проверить, равен ли код возврата нулю, что возвращает false, затем управление передается оператору elif, и условие оценивается как true и запускает блок кода. Вы можете добавить столько операторов elif, чтобы оценивать различные условия.

Вы также можете оценить несколько условий в одном операторе if или elif, используя логический оператор И, ИЛИ.

LOGICAL AND ⇒ && symbol => All the conditions should be evaluated to be true.
LOGICAL OR ⇒ || symbol => Anyone condition should be evaluated to be true.

Ниже приведен пример логического оператора И, в котором целое число, хранящееся в переменных X и Y, оценивается как true. >.

X=10
Y=15
if [[ $X -eq 10 && $Y -eq 15 ]]
then
  echo "ok to proceed"
else
  echo "Not ok to proceed"
fi

Использование логического оператора И

Ниже приведен пример логического оператора OR, где переменная X оценивается как true, а переменная Y оценивается как true. быть ложным.

X=10
Y=15
if [[ $X -eq 10 || $Y -eq 10 ]]
then
  echo "ok to proceed"
else
  echo "Not ok to proceed"
fi

Использование оператора логического ИЛИ

Компактные условные операторы

Если вам нужно просто написать операторы if и else, вы можете использовать сокращенный способ. Вкратце, нет необходимости использовать ключевые слова if..then..else..fi. Вы можете использовать логические операторы И (&&) и логические операторы ИЛИ (||).

[[ condition ]] && << run if condition is evaluated to true >> || << run if condition is evaluated to false >>

Взгляните на приведенный ниже пример. Я пытаюсь проверить, доступен ли пакет neofetch, а если недоступен, пытаюсь его установить.

which neofetch && echo "Neofetch already installed" || sudo apt install neofetch -y

Пример компактного логического выражения

Пояснение кода:

  • Он запустит команду "what neofetch", и если код возврата равен нулю, то будет выполнено все, что следует после оператора &&.
  • Если код возврата больше нуля (оценивается как ложь), все, что идет после оператора ||, будет выполняться.
  • Это похоже на операторы if и else. Оператор "If" будет выполняться только в том случае, если условие оценено как истинное. В данном случае это оператор И. Аналогично, предложение else будет выполняться только тогда, когда условие "if" оценивается как ложное. В данном случае это оператор ИЛИ.
  • На моей машине neofetch уже установлен, поэтому код выхода будет нулевым. Он запустит команду echo. Если neofetch не установлен, он запустит команду apt install.

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

[[ -s ~/.bashrc ]] && echo "Not a empty file" || echo "Empty file"

Компактный оператор проверки логических выражений

Операторы сравнения строк

Подобно проверочным операторам Целое и Файл, у нас есть набор операторов для работы со строками. Ниже приведен важный набор строковых операторов.

-z => Check if string is NULL.
-n => Check if string is not NULL.
== => Check for string equality.
!= => Check for string inequality.

Чтобы проверить, является ли строка NULL или не NULL, используйте флаги -z и -n. Я использую компактный синтаксис условного оператора для оценки условия.

[[ -z "Howdy" ]] && echo "String is NULL" || echo "String is not NULL"
[[ -n "Howdy" ]] && echo "String is not NULL" || echo "String is NULL"

Строка нулевая или нет

Чтобы проверить, равны ли две строки, используйте оператор ==. Строки чувствительны к регистру, поэтому при выполнении сравнения необходимо помнить об этом.

X="Linux"
Y="Linux"
[[ $X == $Y ]] && echo "Equal" || echo "Not equal"

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

Чтобы проверить, не равны ли две строки, используйте оператор !=.

[[ $X != $Y ]] && echo "Not Equal" || echo "Equal"

Не равно оператору

Заключение

В этой статье мы увидели, как работать с условными операторами в Bash. Мы также увидели, как использовать операторы проверки файлов, целочисленные и строковые операторы. Наконец, мы обсудили, как писать компактные условные операторы с использованием логических операторов И и логического ИЛИ, с примерами.

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

Руководства по написанию сценариев Bash:

  • Скрипты Bash: манипулирование строками
  • Сценарии Bash: команда Printf с примерами
  • Скрипты Bash: индексированные массивы с примерами
  • Скрипты Bash: объяснение ассоциативных массивов на примерах
  • Скрипты Bash: цикл For с примерами
  • Скрипты Bash: циклы while и Until с примерами
  • Перенаправление Bash, объясненное примерами
  • Скрипты Bash: переменные, поясняемые примерами
  • Скрипты Bash: функции, поясняемые примерами
  • Команда Bash Echo с примерами для Linux
  • Руководство по Bash Heredoc для начинающих

Статьи по данной тематике