Введение
Принятие решений является одним из фундаментальных понятий компьютерного программирования. Как и в любом другом языке программирования, операторы if
, if..else
, if..elif..else
и операторы if
, вложенные в Bash, могут использоваться для выполнения кода на основе определенного условия.
В этом руководстве мы познакомим вас с основами операторов Bash if
и покажем, как использовать их в сценариях оболочки.
Если заявление
Bash if
условные выражения могут принимать разные формы. Базовый оператор 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.
Если еще заявление
Оператор 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.
Если оператор 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
, выполняется STATEMENTS3
.
В операторе может быть одно или несколько предложений 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
Вложенные объявления, если
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.
Вместо использования вложенных операторов if
обычно более эффективно использовать оператор case.
Несколько условий
Логика операторов 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
( !
). При сравнении строк всегда используйте одинарные или двойные кавычки, чтобы избежать проблем с разделением слов или подстановкой.
Вот некоторые из наиболее часто используемых операторов:
-n VAR
— Истинно, если длина VAR больше нуля.-z VAR
— Истинно, если VAR пуст.STRING1 = STRING2
— True [STRING1 и STRING2 — это одно и то же.STRING1!= STRING2
— Правда, STRING1 и STRING2 не равны.INTEGER1 -eq INTEGER2
— True INTEGER1 и INTEGER2 совпадают.INTEGER1 -gt INTEGER2
— True INTEGER1 больше, чем INTEGER2.INTEGER1 -lt INTEGER2
- True INTEGER1 меньше, чем INTEGER2.INTEGER1 -ge INTEGER2
— True INTEGER1 больше или равно INTEGER2.INTEGER1 -le INTEGER2
- True INTEGER1 меньше или меньше, чем INTEGER2.-h`
ФАЙЛ` — Истинно, если ФАЙЛ существует и является символической ссылкой.-r`
ФАЙЛ` — Истинно, если ФАЙЛ существует и доступен для чтения.-w`
ФАЙЛ` — Истинно, если ФАЙЛ существует и доступен для записи.-x`
ФАЙЛ` — Истинно, если ФАЙЛ существует и является исполняемым.-d`
ФАЙЛ` — Истинно, если ФАЙЛ существует и является каталогом.-e`
ФАЙЛ` — True, если ФАЙЛ существует и является файлом, независимо от типа (узел, каталог, сокет и т. д.).-f`
ФАЙЛ` — Истинно, если ФАЙЛ существует и является обычным файлом (не каталогом или устройством).
Вывод
Объявления if
, if..else
и if..elif..else
позволяют вам управлять потоком выполнения Bash, оценивая определенные условия.