Операторы сравнения Bash

Содержание
Введение
Сравнение чисел
Сравнение строк
Разница между [ ] и [[ ]]
Похожие статьи

Введение

Бинарные операторы сравнения сравнивают две переменные или величины.

Для сравнения строк используются одни операторы сравнения для чисел другие.

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

-eq

is equal to - равняется

if [ "$a" -eq "$b" ]

-ne

is not equal to - не равняется

if [ "$a" -ne "$b" ]

-gt

is greater than - больше чем

if [ "$a" -gt "$b" ]

-eq

is equal to - равняется

if [ "$a" -eq "$b" ]

-ge

is greater than or equal to - больше или равно

if [ "$a" -ge "$b" ]

-lt

is less than - меньше чем

if [ "$a" -lt "$b" ]

-le

is less than or equal to - меньше или равно

if [ "$a" -le "$b" ]

<

is less than (within double parentheses) - меньше чем (в двойных скобках)

(("$a" < "$b"))

<=

is less than or equal to (within double parentheses) - меньше или равно (в двойных скобках)

(("$a" <= "$b"))

>

is greater than (within double parentheses) - больше чем (в двойных скобках)

(("$a" > "$b"))

>=

is greater than or equal to (within double parentheses) - меньше или равно (в двойных скобках)

(("$a" >= "$b"))

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

=

is equal to - равняется

if [ "$a" = "$b" ]

Внимание Обратите внимание на пробелы вокруг =. if [ "$a"="$b" ] не эквивалентно правильному варианту.

==

is equal to - равняется

if [ "$a" == "$b" ]

Это синоним =. Примечание Оператор сравнения == в двойных скобках ведёт себя иначе чем в одиночных. [[ $a == z* ]] # Верно если $a начинается с "z" (pattern matching). [[ $a == "z*" ]] # Верно если $a равняется z* (literal matching). [ $a == z* ] # File globbing and word splitting take place. [ "$a" == "z*" ] # Верно если $a равняется z* (literal matching).

Есть и другие отличия - о них читайте здесь

!=

is not equal to - не равняется

if [ "$a" != "$b" ]

Этот оператор использует pattern matching внутри конструкции [[ ... ]] .

<

Меньше чем, величина определяется порядком в таблице ASCII

if [[ "$a" < "$b" ]] if [ "$a" \< "$b" ]

Обратите внимание, что "<" нужно экранировать внутри конструкции [ ].

>

Больше чем, величина определяется порядком в таблице ASCII

if [[ "$a > "$b" ]] if [ "$a" \> "$b" ]

Обратите внимание на то что ">" нужно экранировать внутри конструкции [ ] .

-z

Строка пустая, то есть имеет длинну равную нулю (string is null, that is, has zero length)

String='' # Zero-length ("null") string variable.

if [ -z "$String" ] then echo "\$String is null." else echo "\$String is NOT null." fi # $String is null.

-n

Строка не пустая (string is not null).

Внимание Для -n тестирования строку нужно заключить в кавычки внутри квадратных скобок. Использовании незакавыченной строки с ! -z, или незакавыченной строк внутри квадратных скобок обычно работает, однако, это небезопасная практика. Всегда заключайте тестовую строку в кавычки.

Разница между [ ] и [[ ]]

Чтобы увидеть разницу запустите скрипт br.sh

Переменная $url специально не определена.

#!/bin/bash if [ $url == "urn.su" ]; then echo "bingo" fi

./br.sh

./br.sh: line 3: [: ==: unary operator expected

А если взять в двойные квадратные скобки - ошибки не будет

#!/bin/bash if [[ $url == "urn.su" ]]; then echo "bingo" fi

./br.sh

Как вариант решения - можно было в одинарных квадратных скобках взять переменную в кавычки

#!/bin/bash if [ "$url" == "urn.su" ]; then echo "bingo" fi

В [[ ]] не нужно экранировать ">"

Сравните:

if [[ "$a > "$b" ]] if [ "$a" \> "$b" ]