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

Источник: https://blog.xsk.in/it/operatsii-sravneniya-v-bash/450/
Опубликовано: 2014-01-18 · Рубрики: IT, Linux


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

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

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

## Структуры "И" / "ИЛИ"

```
-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."
```

*Ссылки:*

- [Изучаем Bash. Операции сравнения целых чисел и строк](http://linuxcenter.kz/page/%D0%B8%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC-bash-%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8-%D1%81%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F-%D1%86%D0%B5%D0%BB%D1%8B%D1%85-%D1%87%D0%B8%D1%81%D0%B5%D0%BB-%D0%B8-%D1%81%D1%82%D1%80%D0%BE%D0%BA)
- [Bash учебное пособие. Часть 6: Структура If…then…else](http://eddnet.org/?p=1311)
- [File attributes comparisons](http://bash.cyberciti.biz/guide/File_attributes_comparisons)
- [Bash учебное пособие. Часть 5: Структурные конструкции и команда test](http://eddnet.org/?p=1230)
- [How To Write a Simple Shell Script on a VPS (Part 3)](https://www.digitalocean.com/community/articles/how-to-write-a-simple-shell-script-on-a-vps-part-3)

