Masalahnya adalah bahwa rentang karakter [a-z]
sebenarnya termasuk huruf besar. Ini dijelaskan dalam manual bash :
Dalam ekspresi braket, ekspresi rentang terdiri dari dua karakter yang dipisahkan oleh tanda hubung. Ini cocok dengan setiap karakter yang menyortir antara dua karakter, inklusif. Di lokal C default, urutan pengurutan adalah urutan karakter asli; misalnya, '[iklan]' sama dengan '[abcd]'. Di lokal lain, urutan pengurutan tidak ditentukan, dan '[iklan]' mungkin sama dengan '[abcd]' atau untuk '[aBbCcDd]' , atau mungkin gagal untuk mencocokkan karakter apa pun, atau set karakter yang pertandingan bahkan mungkin tidak menentu. Untuk mendapatkan interpretasi tradisional ekspresi braket, Anda dapat menggunakan lokal 'C' dengan mengatur variabel lingkungan LC_ALL ke nilai 'C'.
Menggambarkan:
$ 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
Jadi, yang terjadi adalah bahwa di tempat Anda (yang tidak C
), [a-c]
sebenarnya [aAbBcC]
. Itu sebabnya Anda harus menggunakan kelas karakter POSIX seperti yang disarankan oleh @karel.