- 7.3. Операции сравнения
- Операторы сравнения в UNIX shell
- Сравнение чисел
- Пример использования в IF
- Сравнение строк
- Пример использования в IF
- Несколько условий (логические операторы)
- Дополнительно
- Как написать IF в одну строку
- Арифметические операции
- Ошибка «Integer expression expected»
- Операторы сравнения Bash
- Сравнение чисел
- Сравнение строк
- Как сравнивать числа в оболочке Bash в Linux
- Операторы для Баш сравнения чисел
- Примеры в деталях операторов сравнения числа в Bash:
- 1. оператор -eq
- 2. оператор -ge
- 3. оператор -gt
- 4. оператор -le
- 5. оператор -lt
- 6. оператор -ne
- Сравнение чисел в 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 относительно применения этого оператора сравнения.
строка «пустая» , т.е. имеет нулевую длину
строка не «пустая» .
Оператор | Описание | Пример |
---|---|---|
-eq | [ $x -eq $y ] Равно. Для результат True необходимо, чтобы x был равен y. | [ 1 -eq 2 ] — False [ 3 -eq 3 ] — True |
-ne | [ $x -ne $y ] Не равно. Оператор обратный -eq. | [ 1 -ne 2 ] — True [ 3 -ne 3 ] — False |
-gt | [ $x -gt $y ] Больше. То есть проверяет больше ли x чем y. | [ 1 -gt 2 ] — False [ 3 -gt 3 ] — False [ 5 -gt 4 ] — True |
-lt | [ $x -lt $y ] Меньше. Проверяет, что число в левой части (x) меньше числа в правой (y) | [ 1 -lt 2 ] — True [ 3 -lt 3 ] — False [ 5 -lt 4 ] — False |
-ge | [ $x -ge $y ] Больше или равно. | [ 1 -ge 2 ] — False [ 3 -ge 3 ] — True [ 5 -ge 4 ] — True |
-le | [ $x -le $y ] Меньше или равно. | [ 1 -le 2 ] — True [ 3 -le 3 ] — True [ 5 -le 4 ] — False |
Пример использования в IF
if [ $x -eq $y ]
then
echo ‘true’
else
echo ‘false’
fi
Сравнение строк
Оператор | Описание | Пример |
---|---|---|
= | [ «$a» = «$b» ] Равно. То есть строка a равна строке b. | [ ‘linux’ = ‘windows’ ] — False [ ‘unix’ = ‘unix’ ] — True |
!= | [ «$a» != «$b» ] Не равно. Оператор обратный =. | [ ‘linux’ != ‘windows’ ] — True [ ‘unix’ != ‘unix’ ] — False |
= |
$b ]] Содержит.
То есть в строке a есть b.
Обратите внимание, что для данного оператора используются двойные квадратные скобки.
‘windows’ ]] — False
[[ ‘unix’ =
‘ni’ ]] — True
Оператор проверяет, является ли строка b с нулевым размером.
[ -z » ] — True
Оператор обратный -z.
[ -n » ] — False
Оператор проверяет, является ли строка b не пустой.
[ » ] — False
Оператор проверяет, существует ли файл $file.
[ -f » ] — False
Пример использования в IF
if [ «$a» = «$b» ]
then
echo ‘true’
elif [[ «$a» =
$b ]]
then
echo ‘true’
else
echo ‘false’
fi
Несколько условий (логические операторы)
Оператор | Описание | Пример |
---|---|---|
-a | [ $x -eq $y -a $z -le $w ] Логическое И. В данном примере, проверяет, что (x равно y) И (z меньше или равно w) | [ 1 -eq 2 -a 3 -le 4 ] — False [ 5 -eq 5 -a 3 -le 4 ] — True [ 5 -eq 5 -a 6 -le 4 ] — False |
-o | [ $x -ne $y -o $z -ge $w ] Логическое ИЛИ. В данном примере, проверяет, что (x не равно y) ИЛИ (z больше или равно w) | [ 1 -eq 2 -o 3 -le 4 ] — True [ 5 -eq 5 -o 3 -le 4 ] — True [ 5 -eq 5 -o 6 -le 4 ] — True [ 1 -eq 2 -o 6 -le 4 ] — False |
Дополнительно
Как написать IF в одну строку
if [ $x -ne 0 ]; then echo 1; fi
if [ $x -ne 0 -a $y -eq 1 ]; then echo 1; else echo 2; fi
Арифметические операции
Расчет можно выполнить одним из следующих методов:
sum=$(( $sum1 + $sum2 + $sum3 ))
sum=`expr $sum1 + $sum2 + $sum3`
* где операции могут быть следующие:
- + — сложение;
- — — вычитание;
- * — умножение;
- / — деление;
- % — остаток от деления;
- = — приравнивание.
Ошибка «Integer expression expected»
Чаще всего, возникает при попытках использовать не тот оператор, например для строки -le (который должен использоваться для числа).
Примеры неправильного использования операторов:
Источник
Операторы сравнения Bash
Бинарные операторы сравнения сравнивают две переменные или величины.
Для сравнения строк используются одни операторы сравнения для чисел другие.
Сравнение чисел
is equal to — равняется
is not equal to — не равняется
is greater than
is equal to — равняется
is greater than or equal to
is less than or equal to
is greater than (within double parentheses)
is greater than or equal to (within double parentheses)
Сравнение строк
is equal to — равняется
Caution Note the whitespace framing the =. if [ «$a»=»$b» ] is not equivalent to the above.
is not equal to — не равняется
This is a synonym for =. Note The == comparison operator behaves differently within a double-brackets test than within single brackets. [[ $a == z* ]] # True if $a starts with an «z» (pattern matching). [[ $a == «z*» ]] # True if $a is equal to z* (literal matching). [ $a == z* ] # File globbing and word splitting take place. [ «$a» == «z*» ] # True if $a is equal to z* (literal matching). # Thanks, Stéphane Chazelas
is not equal to — не равняется
This operator uses pattern matching within a [[ . ]] construct.
is greater than, in ASCII alphabetical order
if [[ «$a» > «$b» ]] if [ «$a» \> «$b» ]
Note that the «>» needs to be escaped within a [ ] construct. See Example 27-11 for an application of this comparison operator.
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.
string is not null.
Caution The -n test requires that the string be quoted within the test brackets. Using an unquoted string with ! -z, or even just the unquoted string alone within test brackets (see Example 7-6) normally works, however, this is an unsafe practice. Always quote a tested string.
Источник
Как сравнивать числа в оболочке Bash в Linux
Операторы для Баш сравнения чисел
-eq | сравнить цифры в bash для равенства, возвращает 0, если равно | if [ $a -eq $b ] then |
-ge | сравнения чисел в bash, если больше или равно. Результат возвращает 0, если больше или равно | if [ $a -ge $b ] then |
-gt | сравнивает числа в bash, если больше. | if [ $a -gt $b ] then |
-le | сравнивает числа в bash, если меньше или равно. | if [ $a -le $b ] then |
-lt | сравнивает числа в bash, если меньше. | if [ $a -lt $b ] then |
-ne | сравнивает числа в bash, если не равно или нет. | if [ $a -ne $b ] then |
Примеры в деталях операторов сравнения числа в Bash:
1. оператор -eq
Этот оператор сравнивает числа, будет проверять значение равно или нет. Если оно равно, то возвращается 0.
В приведенном выше примере мы взяли числа 2 и 3 в первый раз и система возвратила значение 1, однако, когда мы приняли одинаковые значения для а и б, переменная возвращает нулевое значение.
2. оператор -ge
Этот оператор сравнивает числа и проверяет значения на больше или равно. Если значение больше или равно, то он возвращаемое значение 0.
3. оператор -gt
Этот оператор сравнения чисел будет проверять число на большее. Если значение больше, то возвращает 0.
4. оператор -le
Этот оператор сравнения числа будет проверять значения на меньше или равно. Если оно меньше или равно, то возвращаемое значение 0.
5. оператор -lt
Этот оператор сравнения числа будет проверять значения на меньшее. Если число меньше, то возвращаемое значение 0.
6. оператор -ne
Этот оператор сравнения числа будет проверять значения на не равно. Если числа не равны, то возвращаемое значение равно 0.
Источник
Сравнение чисел в bash
Добрый день. Никак не пойму. Как сравнивать два числа. Есть a=2 b=2
как правильно if [[ $a -eq $b ]] или if [[«$a» -eq «$b» ]]
и можно ли использовать символы =
2-й вариант надёжнее. Впрочем, двойные скобки уже убирают большинство косяков bash
В принципе можно, но вообще «==» используется для сравнения строк, а для чисел «-eq» и пр.
В оригинале нет добавленных полезных комментариев.
бекпортят только вредные? 🙂
2-й вариант надёжнее. Впрочем, двойные скобки уже убирают большинство косяков bash
Косяки эти у вас, а не в bash. В [[ и сравнении чисел типа -eq кавычки ничего не меняют от слова вообще.
В оригинале нет (добавленных полезных комментариев).
Косяки эти у вас, а не в bash. В [[ и сравнении чисел типа -eq кавычки ничего не меняют от слова вообще.
Ок, а теперь в переменную b попала пустая строка вместо числа. Что вернёт сравнение с одинарными скобками без кавычек?
Пустая переменная в целочисленных выражениях эквивалентна 0.
в переменную b попала пустая строка вместо числа.
Это запрещенное состояние для численной переменной. Проверяйте состояние до сравнения
Ответ неверный, проверяй в консоли
Это запрещенное состояние для численной переменной. Проверяйте состояние до сравнения
Что не оправдывает паршивый синтаксис. Необходимо брать переменные в кавычки, или использовать двойные скобки, которые убирают большинство косяков bash
А это ничего, что вы пишите автору bash-стиля персеру выражений в ash?
Оно и видно. Слабо вначале прочитать стартовое сообщение и текущую нить спора перед тем как пытаться похамить?
Я давно использую несколько перегруженный вариант
Такая практика сложилась с частого использования (t)csh и соотв. алиаса
alias MATH ‘set \!:1 = `echo «\!:3-$» | bc -l`’
«unary operator expected» Т.е. потеря одного из аргументов это типа норм и bash идеален?
Правильно: с помощью Python.
Неправильно: с помощью Bash.
Сказал умирающий в одиночестве Ларри, когда все уже писали на питоне.
Да откуда ж вы такие придурки беретесь?
Какой пхытон, когда баш есть? А если баша не хватает, то можно либо на С написать, либо скрипт для октавы быстренько накалякать.
«unary operator expected» Т.е. потеря одного из аргументов это типа норм и bash идеален?
Не пишет bash такую ошибку при использовании встроенного синтаксиса [[ ]]. Читать надо внимательнее, прежде чем комменты писать, тогда и обсираться не будете.
Не пишет bash такую ошибку при использовании встроенного синтаксиса [[ ]].
Мой первый комментарий в теме:
Впрочем, двойные скобки уже убирают большинство косяков bash
Так что все лежащие тут какашки ваши 😉
На что и было отвечено, что это не проблема bash. Это проблема обратной совместимости с sh, когда было 64k на процесс и встраивать утилиты в shell было просто непозволительно, потому [ — это test, изначально внешняя утилита, она не может знать о внутренней кухне shell, она берет как и все утилиты строчные аргументы. [[ и придуман изначально не в bash, а в ksh, и не устраняет и не косяки, а меняет эмуляцию внешнего вызова на встроенный синтаксис языка.
Это проблема обратной совместимости с sh
А как быть, если необходимо использовать sh, а не bash? Какое-нибудь «устоявшееся решение» есть?
А как быть, если необходимо использовать sh, а не bash? Какое-нибудь «устоявшееся решение» есть?
Конечно. Так как особого смысла в сравнении не чисел нет, всё равно скрипт будет работать чёрте-как с ошибкой, то просто надо вначале сделать алгоритм, который гарантирует, что сравниваются числа, и тогда и ни [[, ни кавычки — не нужны.
который гарантирует, что сравниваются числа
Так я и спрашивал об этом. Ссылок на вменяемый материал есть?
PS: И не только числа. Интересует грамотная проверка не-«пустот».
Так я и спрашивал об этом. Ссылок на вменяемый материал есть?
Об этом — это об чём? Ни в минимальном ни в большом sh нет простого теста, что аргумент в [/[[ — число, даже на regex сделать хорошую проверку, что не будет переполнения в общем виде не возможно. Если это внешние/человеческие вводимые данные, то их надо всегда тщательно проверять. Общего рецепта — нет, так как может вам отрицательные числа тоже не подойдут, либо больше миллиона. Если это внутренние данные, то надо просто качественно писать программу.
Я и не жду «общего». Это было бы странно, если бы оно было, а о нём никто не знал. Интересует проверка не-«пустот» без нагромождения if [ ! -z «$a» ]
PS: По-моему даже [ ! -z «$a» ] && не прокатывает.
Вы, натурально, не понимаете. У одного одни косяки, у другого — нагромождение. Поймите, если тут МОЖЕТ быть пусто, и вы это не хотите, значить надо проверять. Если тут пусто — это=0, то в bash это по умолчанию, а в других можно сделать такое присваивание. Если тут не может быть — то и не надо. Видите? Никакого нагромождения и нет.
У одного одни косяки, у другого — нагромождение
Но не в вакууме же живём. Кто-нибудь уже обходил «пустоты». Что, каждый раз один и тот же «велосипед» придумывать? Только с «разными» колёсами.
Их не надо обходить. Их надо интерпретировать согласно алгоритму. В каждом конкретном месте пустая переменная может означать что-то своё, и 0 и default-value и ошибку во входных данных. Потому если у вас «$may_be_empty_var» означает default-value, то можно написать $
В каждом конкретном месте пустая переменная может означать что-то своё.
Уход от темы. Не гоже.
Возврат в тему. 1) Сравнение if [ $a -eq $b ] . Как грамотно обойти «пустоты», чтобы не завалился скрипт.
Источник