शेल स्क्रिप्टिंग में केस संवेदनशीलता


10

इस बैश स्क्रिप्ट पर विचार करें:

#!/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

यदि मैं 'a' दर्ज करता हूं, तो आउटपुट लोअर केस लेटर है , और यह 'A' के लिए समान है ... मैं इसे कैसे पार कर सकता हूं?


जब आप एक स्क्रिप्ट पोस्ट करते हैं तो सुनिश्चित करें कि आप व्हाट्सएप रखने के लिए कोड प्रारूप का उपयोग करते हैं। इसके अलावा, वास्तविक प्रश्न क्या है? मुझे यकीन नहीं है कि आपका क्या मतलब है ...
एज़ेफ़ेरिस

2
@Arronical कोई जरूरत नहीं, गूंज आरक्षित शब्दों के साथ सौदा कर सकते हैं echo if case then do
टेराडन

एक ऐसी ही समस्या के लिए, लेकिन प्रकार के साथ काम कर, देख askubuntu.com/questions/597924/...
जो

जवाबों:


20
#!/bin/bash
echo 'enter any character'
read char
case $char in
[[:lower:]]) echo 'lower case letter'
    ;;
[[:upper:]]) echo 'upper case letter'
    ;;
[0-9]) echo 'number'
    ;;
?) echo 'special char'
    ;;
*) echo 'u entered more than one char' 
    ;;
esac  

कम मामले के बारे में अधिक जानकारी के लिए [az] की नियमित अभिव्यक्ति और bash में [AZ] के ऊपरी मामले की नियमित अभिव्यक्ति देखें कि nocasematch बंद होने पर केस स्टेटमेंट केस-संवेदी क्यों नहीं है?


6
इसके बाद से, इसके बजाय [0-9]आप का उपयोग कर सकते हैं [[:digit:]]। आप man grepGoogle पॉज़िक्स वर्ण कक्षाओं में या उससे अधिक उदाहरण पा सकते हैं ।
धान लैंडौ

21

समस्या यह है कि चरित्र श्रेणी में [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 द्वारा सुझाया गया है।


4
अधिक सटीक रूप से, आपको सेट LC_COLLATEकरने की आवश्यकता है C, अन्य लोकेल सेटिंग्स के लिए अलग होना ठीक है। LC_COLLATEकिसी भी चीज़ के लिए सेट करना Cशायद ही कभी एक अच्छा विचार है लेकिन दुख की बात है कि उबंटू ऐसा करता है (यह अब तक एकमात्र अपराधी नहीं है)।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.