В этом учебнике вы узнаете об основах оператора Bash условие if и научитесь использовать его в своих сценариях оболочки.
Принятие решений - одна из самых фундаментальных концепций компьютерного программирования. Как и в любом другом языке программирования, операторы if, if..else, if..elif..else и вложенные операторы if в Bash используются для выполнения кода на основе определенного условия.
Условие if
Условные выражения Bash if могут иметь различные формы. Самый простой оператор if имеет следующую форму:
1 2 3 4 | if TEST-COMMAND then ... fi |
Оператор if начинается с ключевого слова if, за которым следует условное выражение и ключевое слово then. Оператор заканчивается ключевым словом fi.
Если значение TEST-COMMAND равно True, то выполняется операторы между then и fi. Если TEST-COMMAND возвращает False, ничего не происходит; команды игнорируется.
В целом, хорошей практикой является отступ от текста и разделение блоков кода пустыми строками. Большинство людей предпочитают использовать отступы в 4 или 2 интервала. Отступы и пустые строки делают ваш код более читабельным и организованным.
Рассмотрим следующий пример сценария, который проверяет, больше ли заданное число 10:
1 2 3 4 5 6 7 8 9 | #!/bin/bash echo -n "Введите число: " read VAR if [[ $VAR -gt 10 ]] then echo "Переменная больше 10" fi |
Сохраните код в файле и запустите его из командной строки:
1 | bash test.sh |
Сценарий предложит вам ввести число. Если, например, вы введете 15, команда test примет значение true, поскольку 15 больше 10, и будет выполнена команда echo в предложении then.
Утверждение if..else
Оператор Bash if...else имеет следующую форму:
1 2 3 4 5 6 | if TEST-COMMAND then команда1 else команда2 fi |
Если TEST-COMMAND выдает значение True, то будет выполнена команда1. В противном случае, если TEST-COMMAND возвращает значение False, будет выполнено команда2. В операторе может быть только одно предложение else
Давайте добавим предложение else к предыдущему примеру сценария:
1 2 3 4 5 6 7 8 9 10 11 | #!/bin/bash echo -n "Введите число: " read VAR if [[ $VAR -gt 10 ]] then echo "Переменная больше 10" else echo "Переменная равна или меньше 10" fi |
Если вы запустите код и введете число, сценарий выведет другое сообщение в зависимости от того, больше или меньше/равно 10 это число.
Утверждение if..elif..else
Оператор Bash if..elif..else имеет следующую форму:
1 2 3 4 5 6 7 8 9 | if TEST-COMMAND1 then команда1 elif TEST-COMMAND2 then команда2 else команда3 fi |
Если значение команды TEST-COMMAND1 равно True, будет выполнено команда1. Если значение TEST-COMMAND2 равно True, будет выполнено команда2. Если ни одна из тестовых команд не имеет значения True, то выполняется команда3.
В операторе может быть один или несколько пунктов elif. Предложение else является необязательным.
Условия оцениваются последовательно. Если условие возвращает значение True, остальные условия не выполняются, а управление программой переходит к концу оператора if.
Давайте добавим к предыдущему сценарию условие elif:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/bin/bash echo -n "Введите число: " read VAR if [[ $VAR -gt 10 ]] then echo "Переменная больше 10" elif [[ $VAR -eq 10 ]] then echo "Переменная равна 10" else echo "Переменная меньше 10" fi |
Вложенные операторы if
Bash позволяет вложить операторы if внутрь операторов if. Вы можете поместить несколько операторов if внутри другого оператора if.
Следующий сценарий попросит вас ввести три числа и выведет наибольшее число из этих трех чисел.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #!/bin/bash echo -n "Введите первое число: " read VAR1 echo -n "Введите второе число: " read VAR2 echo -n "Введите третье число: " read VAR3 if [[ $VAR1 -ge $VAR2 ]] then if [[ $VAR1 -ge $VAR3 ]] then echo "$VAR1 - наибольшее число" else echo "$VAR3 - наибольшее число" fi else if [[ $VAR2 -ge $VAR3 ]] then echo "$VAR2 - наибольшее число" else echo "$VAR3 - наибольшее число" fi fi |
Множественные условия
Логические операторы OR и AND позволяют использовать несколько условий в операторах if.
Вот еще одна версия сценария для печати наибольшего числа из трех чисел. В этой версии вместо вложенных операторов if мы используем логический оператор AND (&&).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #!/bin/bash echo -n "Введите первое число: " read VAR1 echo -n "Введите второе число: " read VAR2 echo -n "Введите третье число: " read VAR3 if [[ $VAR1 -ge $VAR2 ]] && [[ $VAR1 -ge $VAR3 ]] then echo "$VAR1 - самое большое число". elif [[ $VAR2 -ge $VAR1 ]] && [[ $VAR2 -ge $VAR3 ]] then echo "$VAR2 - наибольшее число" else echo "$VAR3 - наибольшее число" fi |
Операторы теста
В Bash команда test принимает одну из следующих синтаксических форм:
1 2 3 | 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 - Истинно, если ФАЙЛ существует и является символической ссылкой.
- -r FILE - Верно, если ФАЙЛ существует и доступен для чтения.
- -w FILE - Верно, если ФАЙЛ существует и доступен для записи.
- -x FILE - Верно, если ФАЙЛ существует и является исполняемым.
- -d FILE - Верно, если ФАЙЛ существует и является каталогом.
- -e FILE - Верно, если ФАЙЛ существует и является файлом, независимо от типа (узел, каталог, сокет и т.д.).
- -f FILE - Истинно, если ФАЙЛ существует и является обычным файлом (не каталогом или устройством).