
В этой статье вы познакомитесь с основами оператора bash if...else и поймете, как использовать его в скриптах оболочки.
Принятие решений — одна из фундаментальных концепций программирования. Как и в любом другом языке программирования, операторы if , if...else , if...elif...else и вложенные операторы if в Bash используются для выполнения кода при выполнении определённого условия.
if оператор
Условные операторы if в Bash могут иметь различные формы. Самый простой вариант оператора if выглядит следующим образом:
if TEST-COMMAND then STATEMENTS fi
Оператор if начинается с ключевого слова if за которым следует условное выражение и ключевое слово then . Оператор заканчивается ключевым словом fi .
Если TEST-COMMAND возвращает значение True , выполняются STATEMENTS . Если TEST-COMMAND возвращает значение False , ничего не происходит; STATEMENTS игнорируются.
Как правило, рекомендуется делать отступы в коде и разделять блоки пустыми строками. Большинство людей предпочитают использовать отступы в 4 или 2 пробела. Отступы и пустые строки делают код более читабельным и структурированным.
Давайте рассмотрим следующий пример скрипта, который проверяет, больше ли заданное число 10:
#!/bin/bash echo -n "Enter a number: " read VAR if [[ $VAR -gt 10 ]] then echo "The variable is greater than 10." fi
Сохраните код в файле и запустите его из командной строки:
bash test.sh
Скрипт предложит вам ввести число. Например, если вы введёте 15, test команда будет оценена как true поскольку 15 больше 10, и будет выполнена команда echo внутри предложения then .
The variable is greater than 10.
if...else оператор
Оператор Bash if...else имеет следующую форму:
if TEST-COMMAND then STATEMENTS1 else STATEMENTS2 fi
Если TEST-COMMAND возвращает значение True , будет выполнен оператор STATEMENTS1 . В противном случае, если TEST-COMMAND возвращает False , будет выполнен оператор STATEMENTS2 . В операторе может быть только одно предложение else .
Давайте добавим предложение else к предыдущему примеру скрипта:
#!/bin/bash echo -n "Enter a number: " read VAR if [[ $VAR -gt 10 ]] then echo "The variable is greater than 10." else echo "The variable is equal or less than 10." fi
Если запустить код и ввести число, скрипт выведет разное сообщение в зависимости от того, больше или меньше/равно ли число 10.
if...elif...else Оператор
Оператор Bash if...elif...else имеет следующую форму:
if TEST-COMMAND1 then STATEMENTS1 elif TEST-COMMAND2 then STATEMENTS2 else STATEMENTS3 fi
Если TEST-COMMAND1 даёт результат True , будет выполнена команда STATEMENTS1 . Если TEST-COMMAND2 даёт результат True , будет выполнена команда STATEMENTS2 . Если ни одна из тестовых команд не даёт результат True , будет выполнена команда STATEMENTS2 .
В операторе может быть одно или несколько предложений elif . Предложение else необязательно.
Условия проверяются последовательно. Как только условие возвращает True , остальные условия не проверяются, и управление программой переходит в конец операторов if .
Давайте добавим предложение elif к предыдущему скрипту:
#!/bin/bash echo -n "Enter a number: " read VAR if [[ $VAR -gt 10 ]] then echo "The variable is greater than 10." elif [[ $VAR -eq 10 ]] then echo "The variable is equal to 10." else echo "The variable is less than 10." fi
Вложенные операторы if
Bash позволяет вкладывать операторы if if в друга.
Вы можете поместить несколько операторов if внутрь другого оператора if .
Следующий скрипт предложит вам ввести три числа и вывести наибольшее число из этих трех.
#!/bin/bash echo -n "Enter the first number: " read VAR1 echo -n "Enter the second number: " read VAR2 echo -n "Enter the third number: " read VAR3 if [[ $VAR1 -ge $VAR2 ]] then if [[ $VAR1 -ge $VAR3 ]] then echo " $VAR1 is the largest number." else echo " $VAR3 is the largest number." fi else if [[ $VAR2 -ge $VAR3 ]] then echo " $VAR2 is the largest number." else echo " $VAR3 is the largest number." fi fi
Вот как будет выглядеть результат:
Enter the first number: 4 Enter the second number: 7 Enter the third number: 2 7 is the largest number.
Как правило, эффективнее использовать оператор case вместо вложенных операторов if .
Множественные условия
Логические операторы OR и AND позволяют использовать несколько условий в операторах if .
Вот ещё одна версия скрипта для вывода наибольшего числа из трёх. В этой версии вместо вложенных операторов if мы используем логический оператор AND ( && ).
#!/bin/bash echo -n "Enter the first number: " read VAR1 echo -n "Enter the second number: " read VAR2 echo -n "Enter the third number: " read VAR3 if [[ $VAR1 -ge $VAR2 ]] && [[ $VAR1 -ge $VAR3 ]] then echo " $VAR1 is the largest number." elif [[ $VAR2 -ge $VAR1 ]] && [[ $VAR2 -ge $VAR3 ]] then echo " $VAR2 is the largest number." else echo " $VAR3 is the largest number." fi
Тестовые операторы
В Bash команда test принимает одну из следующих синтаксических форм:
test EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]]
Чтобы сделать скрипт переносимым, используйте старую команду test [ , доступную во всех оболочках POSIX. Новая обновлённая версия команды test [[ (двойные скобки) поддерживается большинством современных систем, использующих Bash, Zsh и Ksh в качестве оболочек по умолчанию.
Чтобы отрицать тестовое выражение, используйте логический оператор NOT ( ! ). При сравнении строк всегда используйте одинарные или двойные кавычки, чтобы избежать проблем с разделением слов и подстановкой символов.
Ниже приведены некоторые наиболее часто используемые операторы:
-
-nVAR— Истина, если длинаVARбольше нуля. -
-zVAR— True, еслиVARпуста. -
STRING1 = STRING2— Истина, еслиSTRING1иSTRING2равны. -
STRING1 != STRING2— Истина, еслиSTRING1иSTRING2не равны. -
INTEGER1 -eq INTEGER2— Истина, еслиINTEGER1иINTEGER2равны. -
INTEGER1 -gt INTEGER2— Истина, еслиINTEGER1большеINTEGER2. -
INTEGER1 -lt INTEGER2— Истина, еслиINTEGER1меньшеINTEGER2. -
INTEGER1 -ge INTEGER2— Истина, еслиINTEGER1равно или больше INTEGER2. -
INTEGER1 -le INTEGER2— Истина, еслиINTEGER1равно или меньшеINTEGER2. -
-hFILE— Истина, еслиFILEсуществует и является символической ссылкой. -
-rFILE— Истина, еслиFILEсуществует и доступен для чтения. -
-wFILE— Истина, еслиFILEсуществует и доступен для записи. -
-xFILE— True, еслиFILEсуществует и является исполняемым. -
-dFILE— Истина, еслиFILEсуществует и является каталогом. -
-eFILE— Истина, еслиFILEсуществует и является файлом, независимо от типа (узел, каталог, сокет и т. д.). -
-fFILE— Истина , еслиFILEсуществует и является обычным файлом (не каталогом или устройством).
Заключение
Операторы if , if...else и if...elif...else позволяют контролировать ход выполнения скрипта Bash путем оценки заданных условий.
Если условие оценивается как ложное, будет выполнен код в необязательном предложении else .
Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.
Связанные руководства