Проблема полягає в тому, що діапазон символів [a-z]насправді включає великі літери. Це пояснено у посібнику з bash :
У дужковому виразі діапазонний вираз складається з двох символів, розділених дефісом. Він відповідає будь-якому одному символу, який сортується між двома символами, включно. У локальній мові С за замовчуванням послідовність сортування є порядковим порядком символів; наприклад, "[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.