मैं हमेशा sh
बैश एक्सटेंशन का उपयोग करने के बजाय POSIX के साथ छड़ी करने की कोशिश करता हूं , क्योंकि स्क्रिप्टिंग का एक प्रमुख बिंदु पोर्टेबिलिटी है (इसके अलावा प्रोग्राम कनेक्ट करने, उन्हें बदलने के बजाय)।
में sh
, "is-prefix" स्थिति के लिए जाँच करने का एक आसान तरीका है।
case $HOST in node*)
# Your code here
esac
यह देखते हुए कि पुराना, आर्कैन और क्रुफ़्टी श है (और बैश इलाज नहीं है: यह अधिक जटिल है, कम सुसंगत और कम पोर्टेबल है), मैं एक बहुत अच्छा कार्यात्मक पहलू इंगित करना चाहूंगा: जबकि कुछ सिंटैक्स तत्व जैसे case
अंतर्निहित हैं , जिसके परिणामस्वरूप निर्माण किसी भी अन्य नौकरी से अलग नहीं हैं। वे उसी तरह से रचे जा सकते हैं:
if case $HOST in node*) true;; *) false;; esac; then
# Your code here
fi
या उससे भी कम
if case $HOST in node*) ;; *) false;; esac; then
# Your code here
fi
या उससे भी कम (सिर्फ !
एक भाषा तत्व के रूप में प्रस्तुत करने के लिए - लेकिन यह अब खराब शैली है)
if ! case $HOST in node*) false;; esac; then
# Your code here
fi
यदि आप स्पष्ट होना पसंद करते हैं, तो अपना स्वयं का भाषा तत्व बनाएँ:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
क्या यह वास्तव में काफी अच्छा नहीं है?
if beginswith node "$HOST"; then
# Your code here
fi
और चूंकि sh
मूल रूप से केवल नौकरियां और स्ट्रिंग-सूचियां हैं (और आंतरिक रूप से प्रक्रियाएं, जिसमें से नौकरियां बनाई जाती हैं), अब हम कुछ हल्की गतिशील प्रोग्रामिंग भी कर सकते हैं:
beginswith() { case $2 in "$1"*) true;; *) false;; esac; }
checkresult() { if [ $? = 0 ]; then echo TRUE; else echo FALSE; fi; }
all() {
test=$1; shift
for i in "$@"; do
$test "$i" || return
done
}
all "beginswith x" x xy xyz ; checkresult # Prints TRUE
all "beginswith x" x xy abc ; checkresult # Prints FALSE
यह सुरुचिपूर्ण है। ऐसा नहीं है कि मैं sh
किसी भी गंभीर चीज का उपयोग करने की वकालत करता हूं - यह वास्तविक दुनिया की आवश्यकताओं पर बहुत जल्दी टूट जाता है (कोई लंबोदा नहीं है, इसलिए हम स्ट्रिंग्स का उपयोग करते हैं। लेकिन स्ट्रिंग्स के साथ नेस्टिंग फ़ंक्शन कॉल संभव नहीं है, आदि)