Сравнение двух строк, содержащих '_' лексикографически в bash - PullRequest
2 голосов
/ 26 мая 2020

Мне нужно лексикографически сравнить строки в скрипте bash. Проблема в том, что кажется, что bash полностью игнорирует символы '_', как будто их вообще нет. В кодовой таблице ascii '_' находится между прописными буквами и строчными буквами, поэтому я предполагаю, что AZ <_ <az, и это то, что на самом деле происходит в ОС Ma c, но не в Debian: </p>

1   $ if [[ "ab" < "a_" ]]; then echo 1; fi
2   $ if [[ "ab" < "a_a" ]]; then echo 1; fi
3   $ if [[ "ab" < "a_c" ]]; then echo 1; fi
    1
4   $ if [[ "aZ" < "a_" ]]; then echo 1; fi
    $

Команда № 3 также должна быть ложной, потому что '_' <'b', а команда № 4 должна быть истинной, потому что '_'> 'Z'.

Единственный логическое объяснение для меня состоит в том, что символы '_' просто опущены в Debian bash, поэтому "ab" <"a" -> false, "ab" <"aa" -> false, "ab" <"a c "-> true," aZ "<" a "-> false - вот что действительно оценивается.

Есть ли в Debian bash способ сравнить эти строки, рассматривая их символы '_' как их код ascii может предложить?

Спасибо

1 Ответ

2 голосов
/ 26 мая 2020

Как указано в комментариях, оператор [[ < ]] зависит от вашего текущего языкового стандарта. Это также описано в руководстве bash :

При использовании с [[, операторы '<' и '>' сортируют лексикографически с использованием текущего языкового стандарта.

Вы можете проверить текущий языковой стандарт с помощью команды locale. Когда вы запускаете эту команду в Ma c OS и Debian, вы должны получить разные результаты.

Вы можете перезаписать локаль вашей системы для вашего скрипта, используя export LC_ALL=.... Локаль для сортировки по кодам ascii: C.

$ export LC_ALL=en_US.UTF-8; [[ ab < a_c ]]; echo $?
0
$ export LC_ALL=C; [[ ab < a_c ]]; echo $?
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...