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

compare bash

Сравнение целых чисел

равно

Copy
if [ "$a" -eq "$b" ]
не равно
Copy
if [ "$a" -ne "$b" ]
больше
Copy
if [ "$a" -gt "$b" ]
больше или равно
Copy
if [ "$a" -ge "$b" ]
меньше
Copy
if [ "$a" -lt "$b" ]
меньше или равно
Copy
if [ "$a" -le "$b" ]
меньше (внутри двойных круглых скобок )
Copy
(("$a" < "$b"))
меньше или равно (внутри двойных круглых скобок)
Copy
(("$a" <= "$b"))
больше (внутри двойных круглых скобок)
Copy
(("$a" > "$b"))
больше или равно (внутри двойных круглых скобок)
Copy
(("$a" >= "$b"))

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

равно

Copy
if [ "$a" = "$b" ]
равно
Copy
if [ "$a" == "$b" ]
Синоним оператора =.

Copy
[[ $a == z* ]]    # истина, если $a начинается с символа "z" (сравнение по шаблону) [[ $a == "z*" ]]  # истина, если $a равна z* [ $a == z* ]      # имеют место подстановка имен файлов и разбиение на слова [ "$a" == "z*" ]  # истина, если $a равна z*

не равно

Copy
if [ "$a" != "$b" ]
Этот оператор используется при поиске по шаблону внутри [[ … ]].

меньше, в смысле величины ASCII-кодов

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

Обратите внимание! Символ “<” необходимо экранировать внутри [ ].

больше, в смысле величины ASCII-кодов

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

Обратите внимание! Символ “>” необходимо экранировать внутри [ ].

-z: строка “пустая”, т.е. имеет нулевую длину

-n: строка не “пустая”.

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

Пример 1. Операция сравнения

Copy
#!/bin/bash a=4 b=5 #  Здесь переменные "a" и "b" могут быть как целыми числами, так и строками. #  Здесь наблюдается некоторое размывание границ #+ между целочисленными и строковыми переменными, #+ поскольку переменные в Bash не имеют типов. #  Bash выполняет целочисленные операции над теми переменными, #+ которые содержат только цифры #  Будьте внимательны! echo if [ "$a" -ne "$b" ] then   echo "$a не равно $b"   echo "(целочисленное сравнение)" fi echo if [ "$a" != "$b" ] then   echo "$a не равно $b."   echo "(сравнение строк)"   #     "4"  != "5"   # ASCII 52 != ASCII 53 fi # Оба варианта, "-ne" и "!=", работают правильно. echo exit 0

Пример 2. Проверка, является ли строка пустой

Copy
#!/bin/bash # str-test.sh: Проверка пустых строк и строк, не заключенных в кавычки, # Используется конструкция   if [ ... ] # Если строка не инициализирована, то она не имеет никакого определенного значения. # Такое состояние называется "null" (пустая) (это не то же самое, что ноль). if [ -n $string1 ]    # $string1 не была объявлена или инициализирована. then   echo "Строка "string1" не пустая." else   echo "Строка "string1" пустая." fi # Неверный результат. # Выводится сообщение о том, что $string1 не пустая, #+не смотря на то, что она не была инициализирована. echo ## Попробуем еще раз. if [ -n "$string1" ]  # На этот раз, переменная $string1 заключена в кавычки. then   echo "Строка "string1" не пустая." else   echo "Строка "string1" пустая." fi      # Внутри квадратных скобок заключайте строки в кавычки! echo if [ $string1 ]       # Опустим оператор -n. then   echo "Строка "string1" не пустая." else   echo "Строка "string1" пустая." fi # Все работает прекрасно. # Квадратные скобки -- [ ], без посторонней помощи определяют, что строка пустая. # Тем не менее, хорошим тоном считается заключать строки в кавычки ("$string1"). # # Как указывает Stephane Chazelas, #    if [ $string 1 ]   один аргумент "]" #    if [ "$string 1" ]  два аргумента, пустая "$string1" и "]" echo string1=initialized if [ $string1 ]       # Опять, попробуем строку без ничего. then   echo "Строка "string1" не пустая." else   echo "Строка "string1" пустая." fi # И снова получим верный результат. # И опять-таки, лучше поместить строку в кавычки ("$string1"), поскольку... string1="a = b" if [ $string1 ]       # И снова, попробуем строку без ничего.. then   echo "Строка "string1" не пустая." else   echo "Строка "string1" пустая." fi # Строка без кавычек дает неверный результат! exit 0

Пример 3. zmost

Copy
#!/bin/bash #Просмотр gz-файлов с помощью утилиты 'most' NOARGS=65 NOTFOUND=66 NOTGZIP=67 if [ $# -eq 0 ] # то же, что и:  if [ -z "$1" ] # $1 должен существовать, но может быть пустым:  zmost "" arg2 arg3 then   echo "Порядок использования: `basename $0` filename" >&2   # Сообщение об ошибке на stderr.   exit $NOARGS   # Код возврата 65 (код ошибки). fi filename=$1 if [ ! -f "$filename" ]   # Кавычки необходимы на тот случай, если имя файла содержит пробелы. then   echo "Файл $filename не найден!" >&2   # Сообщение об ошибке на stderr.   exit $NOTFOUND fi if [ ${filename##*.} != "gz" ] # Квадратные скобки нужны для выполнения подстановки значения переменной then   echo "Файл $1 не является gz-файлом!"   exit $NOTGZIP fi zcat $1 | most # Используется утилита 'most' (очень похожа на 'less'). # Последние версии 'most' могут просматривать сжатые файлы. # Можно вставить 'more' или 'less', если пожелаете. exit     # Сценарий возвращает код возврата, полученный по конвейеру. # На самом деле команда "exit $?" не является обязательной, так как работа скрипта завершится здесь в любом случае, построение сложных условий проверки

-a: логическое И (and) exp1 -a exp2 возвращает true, если оба выражения, и exp1, и exp2 истинны.

-o: логическое ИЛИ (or) exp1 -o exp2 возвращает true, если хотя бы одно из выражений, exp1 или exp2 истинно. Они похожи на операторы Bash && и ||, употребляемые в двойных квадратных скобках. [[ condition1 && condition2 ]]

Операторы -o и -a употребляются совместно с командой test или внутри одинарных квадратных скобок. if [ “exp1" -a "exp2” ]