एक चर की लंबाई सत्यापित करें


27

मुझे चर की लंबाई को सत्यापित करना है (मेरी स्क्रिप्ट की सीमा पाँच अक्षरों में डाली गई है), मैं कुछ इस तरह से सोचता हूँ:

#!/bin/bash
read string
check=${#string}
echo $check
if [ $check -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

क्या अधिक "सुरुचिपूर्ण" समाधान है?


1
आपकी स्क्रिप्ट मानक POSIX में सही ढंग से काम करती है /bin/sh। आपको शेबबैंग लाइन को बदलने पर विचार करना चाहिए #!/bin/shताकि यह अधिक पोर्टेबल हो और वातावरण में चले जहां बैश उपलब्ध नहीं है। इसके अलावा, /bin/shडैश की तरह एक अधिक हल्का खोल हो सकता है जो इंटरैक्टिव उपयोग के लिए सुविधाओं के साथ बोझ नहीं है।
सेलडा

@Celada, इस मामले में सच हालांकि, dashकी ${#string}आप पात्रों के बजाय बाइट की संख्या में लंबाई देना होगा।
स्टीफन चेज़लस

जवाबों:


43

और अधिक सुंदर? नहीं

छोटा? हाँ :)

#!/bin/bash
read string
if [ ${#string} -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

और अगर आपको छोटी होने के पक्ष में अधिक लालित्य का व्यापार करने में कोई समस्या नहीं है, तो आपके पास 2 पंक्तियों वाली स्क्रिप्ट कम हो सकती है:

#!/bin/bash
read string
[ ${#string} -ge 5 ] && echo "error" || echo "done"

यदि आपको लगता है कि यह सुरक्षित है तो आप डबल ब्रैकेट का उपयोग कर सकते हैं। यहाँ स्पष्टीकरण


3

एक बॉर्न-संगत विकल्प ( ${#string}POSIX है, लेकिन बॉर्न नहीं है (ऐसा नहीं है कि आप कभी भी बॉर्न शेल के साथ आने की संभावना है):

case $string in
  ?????*) echo >&2 Too long; exit 1;;
       *) echo OK
esac

ध्यान दें कि दोनों के लिए ${#string}और ????, चाहे वह बाइट की संख्या होगी या वर्ण शेल पर निर्भर करेगा। आम तौर पर (यह POSIX द्वारा आवश्यक है), यह वर्णों की संख्या है। लेकिन कुछ गोले जैसे dashकि बहु-बाइट के बारे में नहीं जानते हैं, इसके बजाय यह बाइट्स होगा।

साथ mksh, आप की जरूरत set -o utf8-mode(UTF-8 स्थानों में) यह बहु-बाइट वर्ण को समझने के लिए:

$ string=€€€ bash -c 'echo "${#string}"'
3
$ string=€€€ dash -c 'echo "${#string}"'
9
$ string=€€€ mksh -c 'echo "${#string}"'
9
$ string=€€€ mksh -o utf8-mode -c 'echo "${#string}"'
3
$ locale charmap
UTF-8

विषय बंद है, लेकिन है echo Too longसे हुड के नीचे अलगecho 'Too long'
स्टीवन पैसा

और, अगर आप "बहुत लंबा" होने पर प्रिंट करेंगे, तो मैं अपने ifविकल्प पर और भी अधिक कॉम्पैक्ट कर सकता हूं :)

2
@StevenPenny, echo Too longदो तर्कों ( Tooऔर long) से गुजरती है , echoजिसके लिए echoएक स्पेस (और एक न्यूलाइन द्वारा पीछा किया जाता है) द्वारा अलग किए गए आउटपुट हैं, जबकि echo 'Too long', हम एक Too longतर्क से गुजरते हैं, echoजिसे वह न्यूलाइन द्वारा फॉलो करता है। तो यह कार्य समान है।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.