Pertimbangkan skrip Bash ini:
#!/bin/bash
echo Enter any character
read char
case $char in
[a-z]) echo Lower case letter
;;
[A-Z]) echo Upper case letter
;;
[0-9]) echo Number
;;
?) echo Special char
;;
*) echo You entered more than one character
;;
esac
Jika saya memasukkan 'a', hasilnya adalah huruf kecil , dan itu sama untuk 'A' ... Bagaimana saya mengatasinya?
echo if case then do
.Jawaban:
Untuk informasi lebih lanjut tentang ekspresi reguler huruf kecil dari [az] dan ekspresi reguler huruf besar dari [AZ] di bash lihat Mengapa pernyataan case case-sensitive ketika nocasematch dimatikan? .
sumber
[0-9]
Anda dapat menggunakan[[:digit:]]
. Anda dapat menemukan lebih banyak contoh diman grep
, atau kelas karakter Google posix .Masalahnya adalah bahwa rentang karakter
[a-z]
sebenarnya termasuk huruf besar. Ini dijelaskan dalam manual bash :Menggambarkan:
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.sumber
LC_COLLATE
keC
, tidak apa-apa untuk pengaturan lokal lainnya menjadi berbeda. PengaturanLC_COLLATE
untuk apa pun tetapiC
jarang merupakan ide yang baik tetapi sayangnya Ubuntu melakukannya (itu bukan satu-satunya penyebab sejauh ini).