практически любой язык программирования включает в себя условные операторы, предназначенные для проверки условий, чтобы выбрать тот или иной путь развития событий в зависимости от этих условий. В Bash, для проверки условий, имеется команда test, различного вида скобочные операторы и условный оператор if/then.
7.1. Конструкции проверки условий
Оператор if/then проверяет — является ли код завершения списка команд 0 (поскольку 0 означает «успех» ), и если это так, то выполняет одну, или более, команд, следующие за словом then.
Существует специальная команда — [ (левая квадратная скобка). Она является синонимом команды test, и является встроенной командой (т.е. более эффективной, в смысле производительности). Эта команда воспринимает свои аргументы как выражение сравнения или как файловую проверку и возвращает код завершения в соответствии с результатами проверки (0 — истина, 1 — ложь).
Начиная с версии 2.02, Bash предоставляет в распоряжение программиста конструкцию [[ . ]] расширенный вариант команды test , которая выполняет сравнение способом более знакомым программистам, пишущим на других языках программирования. Обратите внимание: [[ — это зарезервированное слово, а не команда.
Bash исполняет [[ $a -lt $b ]] как один элемент, который имеет код возврата.
Круглые скобки (( . )) и предложение let . так же возвращают код 0 , если результатом арифметического выражения является ненулевое значение. Таким образом, арифметические выражения могут учавствовать в операциях сравнения.
Условный оператор if проверяет код завершения любой команды, а не только результат выражения, заключенного в квадратные скобки.
Оператор if/then допускает наличие вложенных проверок.
Это детальное описание конструкции «if-test» любезно предоставлено Stephane Chazelas.
Пример 7-1. Что есть «истина»?
Упражнение. Объясните результаты, полученные в Пример 7-1.
Когда if и then располагаются в одной строке, то конструкция if должна завершаться точкой с запятой. И if , и then — это зарезервированные слова. Зарезервированные слова начинают инструкцию, которая должна быть завершена прежде, чем в той же строке появится новая инструкция.
Else if и elif
elif — это краткая форма записи конструкции else if . Применяется для построения многоярусных инструкций if/then .
Конструкция if test condition-true является точным эквивалентом конструкции if [ condition-true ], где левая квадратная скобка [ выполняет те же действия, что и команда test. Закрывающая правая квадратная скобка ] не является абсолютно необходимой, однако, более новые версии Bash требуют ее наличие.
Команда test — это встроенная команда Bash, которая выполняет проверки файлов и производит сравнение строк. Таким образом, в Bash-скриптах, команда test не вызывает внешнюю ( /usr/bin/test) утилиту, которая является частью пакета sh-utils . Аналогично, [ не производит вызов утилиты /usr/bin/[, которая является символической ссылкой на /usr/bin/test.
Пример 7-2. Эквиваленты команды test — /usr/bin/test, [ ] , и /usr/bin/[
Конструкция [[ ]] более универсальна, по сравнению с [ ] . Этот расширенный вариант команды test перекочевал в Bash из ksh88 .
Внутри этой конструкции не производится никакой дополнительной интерпретации имен файлов и не производится разбиение аргументов на отдельные слова, но допускается подстановка параметров и команд.
Конструкция [[ . ]] более предпочтительна, нежели [ . ], поскольку поможет избежать некоторых логических ошибок. Например, операторы && , || , и > внутри [[ ]] вполне допустимы, в то время как внутри [ ] порождают сообщения об ошибках.
Строго говоря, после оператора if, ни команда test, ни квадратные скобки ( [ ] или [[ ]] ) не являются обязательными.
Инструкция «if COMMAND» возвращает код возврата команды COMMAND.
Точно так же, условие, находящееся внутри квадратных скобок может быть проверено без использования оператора if.
Внутри (( )) производится вычисление арифметического выражения. Если результатом вычислений является ноль, то возвращается 1 , или «ложь» . Ненулевой результат дает код возврата 0 , или «истина» . То есть полная противоположность инструкциям test и [ ] , обсуждавшимся выше.
В этой статье мы познакомим вас с основами оператора if в Bash и покажем, как их использовать в сценариях оболочки.
Заявление if
Условие if в Bash могут иметь разные формы. Самое основное условие if принимает следующую форму:
Оператор if начинается с ключевого слова if, за которым следует условное выражение и thenключевое слово. Утверждение заканчивается ключевым словом fi.
Если CONDITION оценивается как True, STATEMENTS выполняется. Если CONDITION есть False, ничего не происходит.
Давайте посмотрим на следующий пример:
Сценарий проверит, является ли данное число больше 2019. Сохраните код в виде файла и запустите его из командной строки.
Скрипт предложит вам ввести номер. Например, если вы введете 2020, условие будет оценено как true, потому что 2020 больше 2019, и команда echo в предложении then будет выполнена.
Заявление if..else
Оператор if..else в Bash принимает следующую форму:
Если CONDITION имеет значение True, то выполнится STATEMENTS1, в противном случае, если CONDITION равно False, то выполнится STATEMENTS2. Вы можете иметь только одно предложение else в заявлении.
Давайте добавим предложение else к предыдущему сценарию:
Если вы запустите сценарий и введете число, сценарий напечатает другое сообщение в зависимости от того, больше это число или меньше/равно 2019.
Заявление if..elif..else
Оператор Bash if..elif..else принимает следующую форму:
Если значение CONDITION1 имеет True, то STATEMENTS1 будет выполнен, если значение CONDITION2 равно True, то выполнится STATEMENTS2. Если ни одно из условий не равно True, то выполнится STATEMENTS2.
Вы можете иметь одно или несколько предложений elif в заявлении. Оператор else не обязателен.
Давайте добавим предложение elif к предыдущему сценарию:
Вложенные операторы If
Bash позволяет вам вкладывать оператор if в другой оператор if. Вы можете разместить несколько операторов if внутри другого оператора if.
Следующий скрипт предложит вам ввести три числа и напечатает наибольшее число среди трех чисел.
Вот как будет выглядеть вывод:
Несколько условий
Логические операторы OR и AND позволяют использовать несколько условий в выражениях if.
Вот еще одна версия скрипта для печати наибольшего числа среди трех чисел. В этой версии вместо вложенных выражениях if мы будем использовать логический оператор AND (&&).
Оператор test
В Bash команда test принимает одну из следующих синтаксических форм:
Если вы хотите, чтобы ваш скрипт был переносимым, вы должны предпочесть использовать старую [команду test, которая доступна во всех оболочках POSIX. Новая обновленная версия команды test [[(двойные скобки) поддерживается в большинстве современных систем, использующих Bash, Zsh и Ksh в качестве оболочки по умолчанию.
Чтобы отменить выражение test, используйте логический оператор NOT( !).
Ниже приведены некоторые из наиболее часто используемых операторов:
-n VAR – Истина, если длина VAR больше нуля.
-z VAR – Верно, если 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.
-h FILE – Истина, если FILE существует и является символической ссылкой.
-r FILE – Истина, если FILE существует и доступен для чтения.
-w FILE – Истина, если FILE существует и доступен для записи.
-x FILE – Истина, если FILE существует и является исполняемым.
-d FILE – Истина, если FILE существует и является каталогом.
-e FILE – Истинно, если FILE существует и является файлом, независимо от его типа (узел, каталог, сокет и т. д.).
-f FILE – Истина, если FILE существует и является обычным файлом (не каталогом или устройством).
Заключение
К настоящему времени вы должны хорошо понимать, как писать операторы if в bash. Вы также можете прочитать о том, как сравнивать строки и как проверить, существует ли файл.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.