Условный оператор If/Then в Bash.
if compound
составная проверка
if/then
if
Если результатом проверки является tue, оператор if осуществляет выполнение содержащихся в нем команд.
В других языках программирования истинному утверждению соответствует число «1», а ложному «0». Bash ведет себя иначе. При проверке входящего значения или выражения истинности соответствует число «0» а ложности «1». Это связанно с тем, что результат выражения на самом деле не преобразуется к логическому типу, он является кодом возврата программы.
В Linux за успешный код завершения программы принято считать число ноль, а за ошибочный соответственно единицу.
В общем виде конструкцию применения условного оператора можно представить следующим образом «if проверяемое_выражение; then набор_команд fi».
Конструкция начинается с ключевого слова if, за которым следует выражение, требующее проверки. После проверки должно располагаться ключевое слово then, свидетельствующее о начале блока команд.
Если проверка входящих параметров располагается на одной строчке с then, после неё необходимо добавить точку с запятой «;».
Конец блока команд должен быть завершен ключевым словом fi.
#!/bin/bash
#если файл существует, выводим сообщение
if [[ -f '/etc/passwd' ]]; then echo "Файл с определением пользователей существует"; fi
#получаем ввод и сверяемся со строкой пароля
password='test67'
echo -n "введите пароль: "read string
if [[ $password = $string ]]
then echo "Пароль введен корректно"
else
echo "Ошибка ввода пароля"
fi
Проверка входящих выражений
Bash позволяет осуществлять проверку условий тремя способами
Выражение | Описание |
---|---|
[ выражение ] | Одинарные квадратные скобки являются псевдонимом встроенной команды test. Они позволяют сравнивать значения друг с другом, а также проверять файлы и директории на существование при указании их имен. |
[[ выражение ]] | Использование двойных кавычек в условном операторе if предпочтительнее предыдущего варианта. Они не являются псевдонимом сторонней команды, а встроены в интерпретатор Bash. Это положительно сказывается на скорости выполнения. К тому же двойные квадратные скобки позволяют использовать логические операторы && или |
(( арифметическая_операция )) | Результат арифметической операции также принимается за логическое значение. Внутри двойных круглых скобок можно использовать операторы >, <, <=, >=, =, != для сравнения чисел. |
Внутри выражения условного оператора if могут обрабатываться одно или несколько значений. Например, проверка существования файла требует указания одного значения - имени файла. При этом оператор проверки записывается вначале. В случае сравнения двух параметров операторы проверок записываются между ними. Ниже мы приводим список допустимых сравнений, а их использование разбирается в примере.
Таблица операторов Bash для проверок значений в условиях
Оператор | Описание |
---|---|
Сравнения чисел | |
-eq или = | Равно. |
-ge или >= | Больше или равно. |
-ne или != | Не равно. |
-gt или > | Больше. |
-lt или < | Меньше. |
-le или <= | Меньше или равно. |
Проверка файлов | |
-f | Существует и является файлом (не директорией). |
-d | Существует и является директорией. |
-r | Доступен для чтения. |
-w | Доступен для записи. |
-x | Файл является исполняемым. |
-O | Принадлежит текущему пользователю. |
-G | Группа идентична текущему пользователю. |
Сравнение строк | |
= | Равенство строк. |
!= | Неравенство строк. |
< | Меньше по ASCII-коду. |
> | Больше по ASCII-коду. |
-n | В строке больше нуля символов. |
-z | В строке ноль символов. [[ -z ${var} ]] |
Пример объединения проверок
#!/bin/bash
#два выражения, объединенных логическим "и"
if (( 4*5 > 15 )) && [ -d '/var/log/apt' ]; then
echo 'Условие истинно'
fi
#аналогичное выражение, но с двойными скобками
if [[ 4*5 -gt 15 && -d '/var/log/apt' ]]; then
echo 'Условие истинно'
fi
#пример арифметической операции в условии
number=145
divider=3
if (( $number/$divider > 30 )); then
echo "${number} деленное на ${divider} равно $[$number/$divider]"
fi
Заметка
Выражение должно отделяться хотя бы одним пробелом от открывающих и закрывающих скобок. Также учитывайте, что операторы сравнения >, <, =, != можно использовать как внутри квадратных скобок, так и в круглых. Однако в квадратных скобках они применяются для сравнения строк, а внутри круглых для чисел.
Альтернативное условие Else
При использовании условного оператора if/then можно задать блок команд, который будет выполнен в случае ложности выражения. Bash позволяет сделать это за счет ключевого слова else. Поместите его в промежутке then и fi. Все команды, лежащие между else и fi, будут считаться альтернативой истинности условия.
#!/bin/bash
#проверка строки на длину и совпадение
code='4567'
string=''
echo -n 'введите проверочный код: '
read string
if [[ -n $string ]];
#вложенная проверка условия
if [[ $code = $string ]];
then
echo 'проверочный код совпал'
else
echo 'код не прошел проверку'
fi
else echo 'слишком короткий код'
fi
Примеры
- Проверка существования файла:
- Другой вариант:
- Проверка существования директории:
- Проверка существования пользователя:
- проверить, пуста ли переменная в Bash
- Проверка, установлен ли пакет в системе
if ! [[ `dpkg -l xemacs21-bin` ]]; then
apt-get -y install xemacs21-bin
else
echo 'package present in system'
fi
- Проверка, существует ли команда в системе?