LINUX.ORG.RU

BASH. Логика при сравнении. Почему со строками =, а с числами -eq?

 ,


1

2

https://www.opennet.ru/docs/RUS/bash_scripting_guide/x2565.html

Чем руководствовались создатели bash? Почему при сравнении чисел нужно писать if [ «$a» -eq «$b» ], а при сравнении строк уже if [ «$a» = «$b» ]?

Ну просто числа — это же математика, логичнее было бы использовать =. В чём «тайный смысл»? Просто для запоминания сложновато...

★★★

Просто используй языки, в которых есть понятие типа.

anonymous ()

Потому что шелл чаще работает со строками чем с числами.

anonymous ()

Не пиши ты на этом сборище костылей, себе дороже.

anonymous ()

Чем руководствовались создатели bash?

Bash тут не при чем. См. man [

Sorcerer ★★★★★ ()

Прежде всего прекрати читать мусор и возьми нормальный гайд - http://mywiki.wooledge.org/BashGuide. В отличие от ABS там не просто перечисляется наследие полувековой давности уровня /bin/[ или некороткозамкнутых -a, -o вперемешку с башизмами, но и предельно доступно объясняется, откуда взялся каждый, и почему этим не надо пользоваться.

d_a ★★★★★ ()

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

proud_anon ★★★★★ ()
Ответ на: комментарий от d_a

Первый раз вижу на LOR-е человека, хоть сколько-то адекватно оценивающего ABS. Впрочем, и читавших собственно Баурна не больше.

ABW ★★★★★ ()
Ответ на: комментарий от ABW

Пока ты выискивал на лоре единственного адекватного оценивателя, остальные фигак-фигак и в продакшн по abs, для чего собственно баш и нужен.

anonymous ()

А ничего, что чисел нет?

t184256 ★★★★★ ()

Почему при сравнении чисел нужно писать if [ «$a» -eq «$b» ], а при сравнении строк уже if [ «$a» = «$b» ]?

А расскажи мне, любезный, что такое строка?

Если тебе вместо eq надо == можешь смело учить php

reprimand ★★★★★ ()

Просто bash - это такое старое говно, которое не знает, что такое тип. Для него всё есть строки(как для Сей всё есть int), и всё что там можно делать - это над ними костылить.

Когда ты указываешь -eq вместо =, ты как бы говоришь этому набору костылей, что эту строку надо сначала прогнать через atoi(), и только потом сравнить получившиеся значения.

Тем более что [, не имеет отношения к bash. Это ссылка на /bin/test, которая является отдельной программой. /bin/test обычно используется для обработки условий sh, который является ещё большим старым говном, и ещё большим набором костылей. Условие, обрабатываемые самим bash, начинаются с [[.

Но к сожалению, пока новой достойной альтернативы никто не додумался написать. Только продолжают пытаться «улучшить» и «исправить ошибки» того, что уже есть.

nexfwall ★★★★ ()
Последнее исправление: nexfwall (всего исправлений: 1 )
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.