Vấn đề là phạm vi ký tự [a-z]
thực sự bao gồm các chữ cái viết hoa. Điều này được giải thích trong hướng dẫn bash :
Trong một biểu thức ngoặc, một biểu thức phạm vi bao gồm hai ký tự được phân tách bằng dấu gạch nối. Nó phù hợp với bất kỳ nhân vật duy nhất sắp xếp giữa hai nhân vật, bao gồm. Trong ngôn ngữ C mặc định, trình tự sắp xếp là thứ tự ký tự gốc; ví dụ: '[quảng cáo]' tương đương với '[abcd]'. Ở các địa phương khác, trình tự sắp xếp không được chỉ định và '[quảng cáo]' có thể tương đương với '[abcd]' hoặc '[aBbCcDd]' hoặc có thể không khớp với bất kỳ ký tự nào hoặc tập hợp các ký tự mà nó Các trận đấu thậm chí có thể thất thường. Để có được cách hiểu truyền thống về biểu thức khung, bạn có thể sử dụng ngôn ngữ 'C' bằng cách đặt biến môi trường LC_ALL thành giá trị 'C'.
Để minh họa:
$ 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
Vì vậy, những gì xảy ra là ở địa phương của bạn (mà không phải C
), [a-c]
thực sự là [aAbBcC]
. Đó là lý do tại sao bạn nên sử dụng các lớp ký tự POSIX theo đề xuất của @karel.