Чувствительность к регистру в сценариях оболочки

Unity Users:

Когда вы нажимаете на индикатор, и вы видите оставшееся время на батарее, щелкните этот пункт меню. Он должен открыть окно, которое позволит вам увидеть эту информацию:

Пользователи KDE:

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

1
задан 14 March 2015 в 23:04

1 ответ

Проблема состоит в том, что диапазон символов [a-z] фактически включает в себя буквы верхнего регистра. Это объясняется в руководстве bash:

В выражении скобки выражение диапазона состоит из двух символов, разделенных дефисом. Он соответствует любому одиночному символу, который сортирует между двумя символами, включительно. В локали C по умолчанию последовательность сортировки является собственным порядком символов; например, '[a-d]' эквивалентно '[abcd]'. В других локалях последовательность сортировки не указывается, а «[ad]» может быть эквивалентной «[abcd]» или «[aBbCcDd]», или она может не соответствовать любому символу или набору символов, которые он совпадения могут быть даже неустойчивыми. Чтобы получить традиционную интерпретацию выражений скобок, вы можете использовать локаль «C», установив переменную среды LC_ALL в значение «C».

Чтобы проиллюстрировать:

$ case B in [a-c]) echo YES;;  *) echo NO;; esac
YES
$ LC_ALL=C; case B in [a-c]) echo YES;; *) echo NO;; esac
NO

Итак, что происходит в вашей локали (которая не является C), [a-c] на самом деле [aAbBcC]. Вот почему вы должны использовать классы символов POSIX bash manual by @karel.

22
ответ дан 23 May 2018 в 22:26
  • 1
    Точнее, вам нужно установить LC_COLLATE на C, для других настроек локали это нормально. Установка LC_COLLATE на что-либо, кроме C, редко является хорошей идеей, но, к сожалению, Ubuntu делает это (это далеко не единственный виновник). – Gilles 14 March 2015 в 00:48

Другие вопросы по тегам:

Похожие вопросы: