Операторы сравнения 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" ]