समस्या यह है कि चरित्र श्रेणी में [a-z]
वास्तव में ऊपरी मामले पत्र शामिल हैं। इसे बाश मैनुअल में समझाया गया है :
एक ब्रैकेट अभिव्यक्ति के भीतर, एक श्रेणी अभिव्यक्ति में एक हाइफ़न द्वारा अलग किए गए दो वर्ण होते हैं। यह किसी भी एकल वर्ण से मेल खाता है, जो दो वर्णों के बीच का समावेश करता है। डिफ़ॉल्ट सी लोकेल में, छँटाई अनुक्रम देशी वर्ण क्रम है; उदाहरण के लिए, '[ad]' '[abcd]' के बराबर है। अन्य स्थानों में, सॉर्टिंग अनुक्रम निर्दिष्ट नहीं है, और '[ad]' '[abcd]' या '[aBbCcDd]' के बराबर हो सकता है , या यह किसी भी वर्ण, या वर्णों के सेट से मेल खाने में विफल हो सकता है - यह मैच अनियमित भी हो सकते हैं। ब्रैकेट अभिव्यक्तियों की पारंपरिक व्याख्या प्राप्त करने के लिए, आप LC_ALL पर्यावरण चर को मान 'C' पर सेट करके '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 द्वारा सुझाया गया है।