Интерпретатор Bash оснащен специальным оператором if/then. Он способен принимать выражение и преобразовывать его результат в логическое значение «правда» или «ложь». При проверке входящего значения или выражения истинности соответствует число «0» а ложности «1».

 

[ выражение ] - Одинарные квадратные скобки являются псевдонимом встроенной команды test. Они позволяют сравнивать значения друг с другом, а также проверять файлы и директории на существование при указании их имен.

[[ выражение ]] - Использование двойных кавычек в условном операторе if предпочтительнее предыдущего варианта. Они не являются псевдонимом сторонней команды, а встроены в интерпретатор Bash. Это положительно сказывается на скорости выполнения. К тому же двойные квадратные скобки позволяют использовать логические операторы && или || для объединения нескольких проверок в одну.

(( арифметическая_операция )) - Результат арифметической операции также принимается за логическое значение. Внутри двойных круглых скобок можно использовать операторы >, <, <=, >=, =, != для сравнения чисел.

 

Таблица операторов Bash для проверок значений в условиях

Оператор        Описание

Сравнения чисел

-eq или =    Равно.

-ge или >=    Больше или равно.

-ne или !=    Не равно.

-gt или >    Больше.

-lt или <    Меньше.

-le или <=    Меньше или равно.

Проверка файлов

-f    Существует и является файлом (не директорией).

-d    Существует и является директорией.

-r    Доступен для чтения.

-w    Доступен для записи.

-x    Файл является исполняемым.

-O    Принадлежит текущему пользователю.

-G    Группа идентична текущему пользователю.

Сравнение строк

=    Равенство строк.

!=    Неравенство строк.

<    Меньше по ASCII-коду.

>    Больше по ASCII-коду.

-n    В строке больше нуля символов.

-z    В строке ноль символов.

 

#!/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, будут считаться альтернативой истинности условия.

 

Примеры:

 

-Check number in variable var1:

UserParameter=key,var1=(......); if (echo "$var1" | egrep "[0-9]") > /dev/null; then echo "1"; else echo "0"; fi

Trigger:
{Server:key.last(#3)}<>1

 

-Проверка пароля:

#!/bin/bash
#проверка строки на длину и совпадение
code='4567'
string=''

echo -n 'введите проверочный код: '
read string

if [[ -n $string ]]; then
    #вложенная проверка условия
    if [[ $code = $string ]]; then
        echo 'проверочный код совпал'
    else
        echo 'код не прошел проверку'
    fi
else
    echo 'слишком короткий код'
fi

 

-После выполнения скрипта можно задать вопрос на повторное выполнение:

read -p "Completed. Run again for other user (y/n)? " REPLY
if [[ $REPLY =~ ^[Yy]$ ]]; then exec $0; else echo STOP; fi

 

-Проверить введена ли переменная:

echo "Enter the first time"
read THEDATE1 if [ -z "$THEDATE1" ]; then echo "ERROR, Variable not entered" && exit 0; fi

 

-Проверить является ли переменная числом:

echo "Enter the first time"
if [[ "$1" = *[[:digit:]]* ]]; then echo "yes"; else echo "no"; fi

 

-Проверить формат введенной даты:

read THEDATE2
if [[ ! "$THEDATE2" =~ ^[0-9]{2}/[0-9]{2}/[0-9]{4}$ ]]; then echo "ERROR, invalid date format, use format: mm/dd/yyyy" && exit 0; fi

В данном случае мы проверяем чтобы формат введенной даты соответствовал - mm/dd/yyyy

 

-Проверить вывод команд до и после пайплайна:

docker exec -t postgres10 pg_dumpall -c -U postgres | gzip > /srv/backup/postgres/dumpall_postgres_$(date '+%Y-%m-%d_%H_%M').sql.gz
if [[ "${PIPESTATUS[0]}" -ne "0" || "${PIPESTATUS[1]}" -ne "0" ]]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR, backup postgres10 didn't done" >> ${SCRIPTLOG} && exit 1; fi

 

Материалы:

https://coder-booster.ru/learning/linux-beginners/conditional-operator-if-in-bash