Операции сравнения в bash

При создании shell-скриптов часто возникает необходимость проверки каких-то условий. Самым простым оператором для этого является if / then / else. Конструкцию if / then всегда необходимо заканчивать словом fi.

if [ выражение ]; then
    оператор1;
    else
        оператор2;
fi

Принцип работы его заключается в следующем: проверяется условие в if, если выражение условия возвращает код завершения 0 (истинно), то выполняется оператор после then (оператор1); если код завершения отличен от нуля (ложно), то выполняется альтернативное действие после else (оператор2) или выход из условия fi в случае отсутствия необязательного условия else.
Условия могут быть вложенными друг в друга; условия могут состоять из нескольких выражений, объединенных логическими операциями И / ИЛИ. При написании условий рекомендуется использовать двойные квадратные кавычки [[,]] для обрамления выражений. В противном случае возникает ошибка интерпретатора, требующая экранирования знаков вроде «<» с помощью специального символа «\».

Структуры «И» / «ИЛИ»

-a логическое И (and)
-o логическое ИЛИ (or)

Например

if [ "$a" = "$b" -a "$c" = "$d" ]; then
    echo "Оба выражения истинны"
fi

Инвертирование результата

if [ ! -f "/home/user/file" ]; then
    echo "Файл не найден"
fi

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

При сравнении чисел используются операторы, являющиеся англоязычными сокращениями:

-eq равно (equal)
-ne не равно (not equal)
-lt меньше (less)
-le меньше или равно (less than or equal)
-gt больше (greater)
-ge больше или равно (greater)

Например:

if [ "$b" -gt "$a" ]; then
     echo "Переменная b больше, чем a"
fi

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

При сравнении строк используются привычные операторы:

=    равно
==   тоже равно
!=   не равно
<    меньше 
>    больше

Например:

if [ "$a" = "mystring" ]; then
    echo "равно"
fi

Кроме математических выражений, для строк доступны следующие условия:

string    строка не нулевая или не определена
-n string строка не нулевая и существует
-z string строка нулевая и существует

Например:

if [ $var ]
then
  echo "Содержимое строки: $var"
else
    echo "Строка пустая или не существует"
fi

Работа с файловой системой

Следующие условия помогут при работе с файлами:

-b file файл существует и это block special file (например, CD-ROM или HDD)
-c file файл существует и это character special file (например, клавиатура или мышь)
-d file файл существует и это директория
-e file файл существует
-f file файл существует и это регулярный файл (не директория)
-g file файл существует и у него установлен set-group-id бит
-h file файл существует и это симлинк
-k file файл существует и у него установлен sticky бит
-p file файл существует и это named-pipe
-r file файл существует и доступен для чтения
-s file файл существует и его размер отличен от нуля
-t fd файловый дескриптор fd открыт и направлен в консоль
-u file файл существует и у него установлен set-user-id бит
-w file файл существует и доступен на запись
-x file файл существует и является исполняемым
-O file файл существует и принадлежит существующему пользователю
-G file файл существует и принадлежит существующей группе
-L file файл существует и это симлинк
-S file файл существует и это сокет
-N file файл существует и был изменен с последнего прочтения

file1 -nt file2 файл file1 изменялся чаще чем file2, или file1 существует, а file2 нет
file1 -ot file2 файл file1 старше чем file2, или file1 существует, а file2 нет
file1 -ef file2 файлы file1 и file2 относятся к одному устройству и номеру инода

-o OPTIONNAME shell опция "OPTIONNAME" включена

Допускается отсутствие служебных слов if / then:

[[ "$var1" -ne "$var2" ]] && echo "$var1 не равно $var2"

Допускается использование оператора test, который служит для проверки состояния файлов, сравнения строк и арифметических сравнений:

test 5 -gt 2 && echo "Yes"
test -f /etc/resolv1.conf && echo "File /etc/resolv1.conf found." || echo "File /etc/resolv1.conf not found."

Ссылки: