7.3. Операции сравнения | Популярный Linux

Опубликовано Bash в Ср, 23/12/2009 — 20:56


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

-eq

равно

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

-ne

не равно

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

-gt

больше

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

-ge

больше или равно

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

-lt

меньше

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

-le

меньше или равно

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

<

меньше (внутри двойных круглых скобок )

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

<=

меньше или равно (внутри двойных круглых скобок)

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

>

больше (внутри двойных круглых скобок)

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

>=

больше или равно (внутри двойных круглых скобок)

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

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

=

равно

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

==

равно

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

Синоним оператора =.

  1. [[ $a == z* ]]    # истина, если $a начинается с символа «z» (сравнение по шаблону)
  2. [[ $a == «z*» ]]  # истина, если $a равна z*
  3. [ $a == z* ]      # имеют место подстановка имен файлов и разбиение на слова
  4. [ «$a« == «z*» ]  # истина, если $a равна z*
  5. # Спасибо S.C.
!=

не равно

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

Этот оператор используется при поиске по шаблону внутри [[ … ]].

<

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

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

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

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

>

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

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

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

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

См. Пример 25-11 относительно применения этого оператора сравнения.

-z

строка «пустая», т.е. имеет нулевую длину

-n

строка не «пустая».

Caution

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

Пример 7-5. Операции сравнения

  1. #!/bin/bash
  2. a=4
  3. b=5
  4. #  Здесь переменные «a» и «b» могут быть как целыми числами, так и строками.
  5. #  Здесь наблюдается некоторое размывание границ
  6. #+ между целочисленными и строковыми переменными,
  7. #+ поскольку переменные в Bash не имеют типов.
  8. #  Bash выполняет целочисленные операции над теми переменными,
  9. #+ которые содержат только цифры
  10. #  Будьте внимательны!
  11. echo
  12. if [ «$a« -ne «$b« ]
  13. then
  14.   echo «$a не равно $b«
  15.   echo «(целочисленное сравнение)»
  16. fi
  17. echo
  18. if [ «$a« != «$b« ]
  19. then
  20.   echo «$a не равно $b
  21.   echo «(сравнение строк)»
  22.   #     «4»  != «5»
  23.   # ASCII 52 != ASCII 53
  24. fi
  25. # Оба варианта, «-ne» и «!=», работают правильно.
  26. echo
  27. exit 0

Пример 7-6. Проверка — является ли строка пустой

  1. #!/bin/bash
  2. # str-test.sh: Проверка пустых строк и строк, не заключенных в кавычки,
  3. # Используется конструкция   if [ … ]
  4. # Если строка не инициализирована, то она не имеет никакого определенного значения.
  5. # Такое состояние называется «null» (пустая) (это не то же самое, что ноль).
  6. if [ -n $string1 ]    # $string1 не была объявлена или инициализирована.
  7. then
  8.   echo «Строка string1 не пустая.»
  9. else
  10.   echo «Строка string1 пустая.»
  11. fi
  12. # Неверный результат.
  13. # Выводится сообщение о том, что $string1 не пустая,
  14. #+не смотря на то, что она не была инициализирована.
  15. echo
  16. # Попробуем еще раз.
  17. if [ -n «$string1« ]  # На этот раз, переменная $string1 заключена в кавычки.
  18. then
  19.   echo «Строка string1 не пустая.»
  20. else
  21.   echo «Строка string1 пустая.»
  22. fi      # Внутри квадратных скобок заключайте строки в кавычки!
  23. echo
  24. if [ $string1 ]       # Опустим оператор -n.
  25. then
  26.   echo «Строка string1 не пустая.»
  27. else
  28.   echo «Строка string1 пустая.»
  29. fi
  30. # Все работает прекрасно.
  31. # Квадратные скобки — [ ], без посторонней помощи определяют, что строка пустая.
  32. # Тем не менее, хорошим тоном считается заключать строки в кавычки («$string1»).
  33. #
  34. # Как указывает Stephane Chazelas,
  35. #    if [ $string 1 ]   один аргумент «]»
  36. #    if [ «$string 1» ]  два аргумента, пустая «$string1» и «]»
  37. echo
  38. string1=initialized
  39. if [ $string1 ]       # Опять, попробуем строку без ничего.
  40. then
  41.   echo «Строка string1 не пустая.»
  42. else
  43.   echo «Строка string1 пустая.»
  44. fi
  45. # И снова получим верный результат.
  46. # И опять-таки, лучше поместить строку в кавычки («$string1»), поскольку…
  47. string1=«a = b»
  48. if [ $string1 ]       # И снова, попробуем строку без ничего..
  49. then
  50.   echo «Строка string1 не пустая.»
  51. else
  52.   echo «Строка string1 пустая.»
  53. fi
  54. # Строка без кавычек дает неверный результат!
  55. exit 0
  56. # Спвсибо Florian Wisser, за предупреждение.

Пример 7-7. zmost

  1. #!/bin/bash
  2. #Просмотр gz-файлов с помощью утилиты ‘most’
  3. NOARGS=65
  4. NOTFOUND=66
  5. NOTGZIP=67
  6. if [ $# -eq 0 ] # то же, что и:  if [ -z «$1» ]
  7. # $1 должен существовать, но может быть пустым:  zmost «» arg2 arg3
  8. then
  9.   echo «Порядок использования: `basename $0` filename» >&2
  10.   # Сообщение об ошибке на stderr.
  11.   exit $NOARGS
  12.   # Код возврата 65 (код ошибки).
  13. fi
  14. filename=$1
  15. if [ ! -f «$filename« ]   # Кавычки необходимы на тот случай, если имя файла содержит пробелы.
  16. then
  17.   echo «Файл $filename не найден!» >&2
  18.   # Сообщение об ошибке на stderr.
  19.   exit $NOTFOUND
  20. fi
  21. if [ ${filename##*.} != «gz» ]
  22. # Квадратные скобки нужны для выполнения подстановки значения переменной
  23. then
  24.   echo «Файл $1 не является gz-файлом!»
  25.   exit $NOTGZIP
  26. fi
  27. zcat $1 | most
  28. # Используется утилита ‘most’ (очень похожа на ‘less’).
  29. # Последние версии ‘most’ могут просматривать сжатые файлы.
  30. # Можно вставить ‘more’ или ‘less’, если пожелаете.
  31. exit $?   # Сценарий возвращает код возврата, полученный по конвейеру.
  32. # На самом деле команда «exit $?» не является обязательной,
  33. # так как работа скрипта завершится здесь в любом случае,

построение сложных условий проверки

-a

логическое И (and)

exp1 -a exp2 возвращает true, если оба выражения, и exp1, и exp2 истинны.

-o

логическое ИЛИ (or)

exp1 -o exp2 возвращает true, если хотябы одно из выражений, exp1 или exp2 истинно.

Они похожи на операторы Bash && и ||, употребляемые в двойных квадратных скобках.

  1. [[ condition1 && condition2 ]]

Операторы -o и
-a употребляются совместно с
командой test или внутри
одинарных квадратных скобок.

  1. if [ «$exp1« -a «$exp2« ]

Чтобы увидеть эти операторы в действии, смотрите Пример 8-3 и Пример 25-16.


[18]    Как указывает S.C., даже заключение строки в кавычки, при построении сложных условий проверки, может оказаться недостаточным. [ -n "$string" -o "$a" = "$b" ] в некоторых версиях Bash такая проверка может вызвать сообщение об ошибке, если строка $string пустая. Безопаснее, в смысле отказоустойчивости, было бы добавить какой-либо символ к, возможно пустой, строке: [ "x$string" != x -o "x$a" = "x$b" ] (символ «x» не учитывается).

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