Проблема в том, что диапазон символов на [a-z]
самом деле включает буквы верхнего регистра. Это объясняется в руководстве по bash :
Внутри выражения в скобках выражение диапазона состоит из двух символов, разделенных дефисом. Он соответствует любому отдельному символу, который сортируется между двумя символами включительно. В языковом стандарте C по умолчанию последовательность сортировки соответствует порядку собственных символов; например, '[ad]' эквивалентно '[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, как предложено @karel.