LINUX.ORG.RU

Как сравниваются строки в bash?

 , ,


0

1

По какому параметру сравниваются строки в баше? Раньше я думал, что по количеству символов. Мне даже в голову не приходило, что строки можно сравнивать как-то по-другому. Но выражение вида:

if [[ b == a ]] или if [[ "b" == "a" ]]

Выдает false.

Почему

a > b

- это false, а наоборот

b < a

Это true. В чем прикол? Что сравнивается? Какой-нибудь номер в ascii-таблице?

Вот например-

if [[ "ac" > "c" ]]
then
  echo "True"
else
  echo "False"

Опять false, т.е. не количество символов сравнивается.

И еще непонятно, есть ли разница использовать кавычки при сравнении строк или нет? Вот это одно и то же?

if [[ "ac" > "c" ]]
if [[ ac > c ]]

Длина строки это видимо ${#str}, а вот что сравнивается по умолчанию, непонятно.

divlns
() автор топика

Строки можно сравнивать посимвольно и в частности сравнивать коды символов.

Почитайте что-нибудь по основам программирования на си.

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

и в частности сравнивать коды символов.

Интересно где такое может понадобиться в практическом плане?

divlns
() автор топика
Ответ на: комментарий от divlns

Где угодно. Поступите в институт и вам там на первом курсе прочитают дисциплину «Основы программирования» и там всё расскажут.

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

А как ещё вы полагаете можно сравнивать? Вот есть у вас известные литералы, они не изменяются всё время жизни программы (ну, в норме). Вы побайтно сравниваете с ними некоторые полученные откуда-то данные в strchr(), либо сразу берёте strstr() которая сделает это за вас.

anonymous
()

Сравниваются ascii-коды посимвольно. В ascii-таблице символы латинского алфавита идут в алфавитном порядке

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

Сравниваются ascii-коды посимвольно. В ascii-таблице символы латинского алфавита идут в алфавитном порядке

Нет. Сравниваются символы в текущей локали по всем правилам strcoll. Поэтому в koi8-r [[ 'е' > 'ё' ]], так как код 'ё' меньше чем даже 'а', а в utf-8 — [[ 'ж' > 'ё' ]], хотя в кодов байт код 'ё' больше чем даже 'я'.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Сравниваются символы в текущей локали по всем правилам strcoll

Проще говоря, применяются правила сортировки. Сравнение в этом виде можно рассматривать, как сравнение номеров в сортированном списке строк.

zvezdochiot

anonymous
()

Раньше я думал, что по количеству символов. Мне даже в голову не приходило, что строки можно сравнивать как-то по-другому.

Мне даже в голову не приходило, что кто-то серьёзно мог так думать.

anonymous
()

man bash (conditional expressions)

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

А как ещё вы полагаете можно сравнивать?

Дело не в том «как», а зачем. Не пойму зачем кому-то сравнивать циферки из ascii-таблицы? Что это дает? Неужели нельзя указать прямо что вот есть набор букв «a», «b», «c», и если в строке встретятся такие- удалить. Или оно работает только через указание ascii-кода, а напрямую к символам обращаться нельзя?

divlns
() автор топика
Ответ на: комментарий от divlns

Дело не в том «как», а зачем. Не пойму зачем кому-то сравнивать циферки из ascii-таблицы? Что это дает?

А как по вашему будет работать проверка на равенство по значению строки, ну вот допустим у вас стоит задача проверить есть ли в строке, допусти 5 слово и оно равно путь будет фамилии «Петров».

Вот вы и будете в цикле срезать из строки слова и проверять каждое слово на равенство фамилии «Петров», а что бы это проверить вам и нужно, что бы сравнение было по кодам символов, потому как если следовать вашему методу, сравнение по длине, то у вас «Петров» может спокойно быть равен «Иванов», потому как длина совпадает.

infomeh ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.