Меню Рубрики

Linux bash операторы сравнения

7.3. Операции сравнения

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

if [ «$a» -eq «$b» ]

if [ «$a» -ne «$b» ]

if [ «$a» -gt «$b» ]

if [ «$a» -ge «$b» ]

if [ «$a» -lt «$b» ]

if [ «$a» -le «$b» ]

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

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

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

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

if [ «$a» = «$b» ]

if [ «$a» == «$b» ]

if [ «$a» != «$b» ]

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

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

if [[ «$a» if [ «$a» \ » необходимо экранировать внутри [ ].

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

if [[ «$a» > «$b» ]]

if [ «$a» \> «$b» ]

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

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

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

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

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

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

Пример 7-7. zmost

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

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

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

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

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

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

Источник

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

Раньше при написании скриптов путался: где квадратные скобки, где круглые, где пробелы. Потом решил всё это дело изучить и классифицировать. И по мотивам статей с англоязычных сайтов получилось вот что:

Оператор Назначение К о н с т р у к ц и и
test [ … ] [[ … ]] (( … ))
-eq равно * * *
-ne неравно * * *
-gt больше * * *
-lt меньше * * *
-ge больше или равно * * *
-le меньше или равно * * *
= равно * * *
== равно (ASCII) * * * *
!= неравно * * * *
> больше (ASCII) * *
меньше (ASCII) * *
>= больше или равно *
меньше или равно *
\> больше (ASCII) * *
\ меньше (ASCII) * *

В результате работы команд test , [ … ] , [[ … ]] или (( … )) — переменной $? присваеваются значения:
0 — если выражение верно
или
1 — если выражение ложно.

Конструкция test

test -оператор При использование test с операторами \> , \ , числа более 10 необходимо заключать в фигурные скобки, иначе результат будет неверный: Также неверный результат будет, если не ставить обратный слэш » \ » перед знаками неравенства.

Конструкция [ … ]

[ -оператор ] При использование [ … ] с операторами \> , \ , числа более 10 необходимо заключать в фигурные скобки, иначе результат будет неверный (с переменными и символами ASCII работает стабильно.):

Конструкция [[ … ]]

[[ -оператор ]] При использовании операторов и > , при числовых значениях более 10 возможны ошибки. Заключение чисел в фигурные скобки ситуацию не исправляет (с переменными и символами ASCII работает стабильно).

Источник

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

При написании сценариев на Bash не только опытные программисты, но и новички в области командного интерпретатора Bash сталкиваются с работой со строками. Наиболее часто это необходимо при считывании команд, вводимых пользователем в качестве аргументов для исполняемого сценария, а также при обработке текстовых файлов. И один из необходимых приёмов в таком случае — это сравнение строк.

В данной статье будет рассмотрено сравнение строк Bash, а также некоторые нюансы по использованию операций сравнения и решению часто встречающихся ошибок.

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

Данные операции позволяют определить, являются ли сравниваемые строки одинаковыми:

  • = — равно, например if [ «$x» = «$y» ]
  • == — синоним оператора «=», например if [ «$x» == «$y» ]
  • != — не равно, например if [ «$x» != «$y» ]

#!/bin/bash
testuser=anton
if [ $USER = $testuser ]
then
echo «Добро пожаловать, $testuser»
fi

Результат работы сценария:

При проверке на равенство с помощью команды test (синоним квадратным скобкам [ ]) учитываются все пунктуационные знаки и различия в регистре букв сравниваемых строк.

Некоторые особенности сравнения строк с шаблонами:

# возвращает истину, если строка, содержащаяся в $x, начинается с символа «y»
[[ $x == y* ]]
# возвращает истину, если строка из $x равна конкретно двум символам «y*»
[[ $x == «y*» ]]
# возвращает истину, если $x содержит название файла, содержащегося в текущем каталоге, которое начинается с «y»
[ $x == y* ]
# возвращает истину, если строка $x равна двум символам «y*»
[ «$x» == «y*» ]

Например проверка строки bash на то, начинается ли она с символа y:

Результат выполнения кода:

Сценарий вывел 0 (ноль), так как мы потребовали вывести код ошибки последней выполненной инструкции. А код 0 означает, что сценарий выполнился без ошибок. И действительно — переменная $x содержит строку yandex, которая начинается с символа «y». В противном случае может писаться «1». Это довольно удобный способ отладки сценариев.

Сравнение строк по алфавиту на Bash

Задача усложняется при попытке определить, является ли строка предшественницей другой строки в последовательности сортировки по возрастанию. Люди, пишущие сценарии на языке командного интерпретатора bash, нередко сталкиваются с двумя проблемами, касающимися операций «больше» и «меньше» относительно сравнения строк Linux, у которых достаточно простые решения:

Во-первых, символы «больше» и «меньше» нужно экранировать, добавив перед ними обратный слэш (\), потому что в противном случае в командном интерпретаторе они будут расцениваться как символы перенаправления, а строки — как имена файлов. Это один из тех случаев, когда отследить ошибку достаточно сложно.

#!/bin/bash
# неправильное использование операторов сравнения строк
val1=baseball
val2=hockey
if [ $val1 > $val2 ]
then
echo «$val1 больше, чем $val2»
else
echo «$val1 меньше, чем $val2»
fi

Что получится, если сравнить строки bash:

Как видно, один лишь символ «больше» в своём непосредственном виде привёл к неправильным результатам, хотя и не было сформировано никаких ошибок. В данном случае этот символ привёл к перенаправлению потока вывода, поэтому никаких синтаксических ошибок не было обнаружено и, как результат, был создан файл с именем hockey:

Для устранения этой ошибки нужно экранировать символ «>», чтобы условие выглядело следующим образом:

Тогда результат работы программы будет правильным:

Во-вторых, упорядочиваемые с помощью операторов «больше» и «меньше» строки располагаются иначе, чем это происходит с командой sort. Здесь проблемы сложнее поддаются распознаванию, и с ними вообще можно не столкнуться, если при сравнении не будет учитываться регистр букв. В команде sort и test сравнение происходит по разному:

#!/bin/bash
val1=Testing
val2=testing
if [ $val1 \> $val2 ]
then
echo «$val1 больше, чем $val2»
else
echo «$val1 меньше, чем $val2»
fi

Результат работы кода:

В команде test строки с прописными буквами вначале будут предшествовать строкам со строчными буквами. Но если эти же данные записать в файл, к которому потом применить команду sort, то строки со строчными буквами будут идти раньше:

Разница их работы заключается в том, что в test для определения порядка сортировки за основу взято расположение символов по таблице ASCII. В sort же используется порядок сортировки, указанный для параметров языка региональных установок.

Проверка строки на пустое значение

Сравнение с помощью операторов -z и -n применяется для определения наличия содержимого в переменной. Таким образом, вы можете найти пустые строки bash. Пример:

#!/bin/bash
val1=testing
val2=»
# проверяет, не пустая ли строка
if [ -n $val1 ]
then
echo «Строка ‘$val1’ не пустая»
else
echo «Строка ‘$val1’ пустая»
fi
# проверяет, пустая ли строка
if [ -z $val2 ]
then
echo «Строка ‘$val2’ пустая»
else
echo «Строка ‘$val2’ не пустая»
fi
if [ -z $val3 ]
then
echo «Строка ‘$val3’ пустая»
else
echo «Строка ‘$val3’ не пустая»
fi

Результат работы кода:

В этом примере создаются две строковые переменные — val1 и val2. Операция -n определяет, имеет ли переменная val1 ненулевую длину, а -z проверяет val2 и val3 на нулевую. Примечательно то, что последняя не была определена до момента сравнения, но интерпретатор считает, что её длина всё же равна нулю. Такой нюанс следует учитывать при различных проверках сценариев. И, если нет уверенности в том, какое значение содержится в переменной и задано ли оно вообще, стоит проверить её с помощью оператора -n или -z и лишь затем использовать по назначению.

Стоит обратить внимание и на функцию -n. Если ей для проверки будет передана необъявленная или пустая переменная, будет возвращена истина, а не ложь. Для таких случаев следует заключать проверяемую строку (переменную) в двойные кавычки, чтобы выглядело это так:

Выводы

В представленных операциях сравнения строк Bash есть определённые нюансы, которые стоит понять для предотвращения ошибок работы сценариев. Но таких ситуаций на практике встречает много, поэтому запомнить все (и тем более, описать) не получится.

При сравнении строк в виде переменных их можно заключать в кавычки практически всегда, так как это считается правилом хорошего тона, а заодно и страхует от семантических ошибок.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Mac os знак евро
  • Mac os звуки системы
  • Mac os звуки для windows 10
  • Mac os звук пропал
  • Mac os звук входа