दो मामले हैं जहाँ मुझे :
उपयोगी लगता है:
डिफ़ॉल्ट चर असाइनमेंट
#!/bin/sh
# set VAR to "default value" if not already set in the environment
: "${VAR=default value}"
# print the value of the VAR variable. Note that POSIX says the behavior
# of echo is implementation defined if the first argument is '-n' or if any
# argument contains a '\', so use printf instead of echo.
printf '%s\n' "VAR=${VAR}"
यह आपके शेल स्क्रिप्ट के उपयोगकर्ताओं को स्क्रिप्ट को संपादित किए बिना सेटिंग को ओवरराइड करने की अनुमति देने का एक सुविधाजनक तरीका है। (हालांकि, कमांड-लाइन तर्क बेहतर हैं क्योंकि आप अनपेक्षित व्यवहार का जोखिम नहीं उठाते हैं यदि उपयोगकर्ता संयोगवश आपके द्वारा अपने निर्यात किए गए वातावरण में चर का उपयोग करता है।) यहां बताया गया है कि उपयोगकर्ता सेटिंग को ओवरराइड कैसे करेगा:
VAR="other value" ./script
${VAR=value}
वाक्य रचना सेट करने के लिए कहते हैं VAR
करने के लिए value
करता है, तो VAR
पहले से ही सेट नहीं है, तो चर के मूल्य का विस्तार। चूंकि हम अभी तक चर के मूल्य के बारे में परवाह नहीं करते हैं, इसलिए इसे :
फेंकने के लिए नो-ऑप कमांड के तर्क के रूप में पारित किया जाता है।
:
एक नो-ऑप कमांड होने के बावजूद , :
कमांड को चलाने से पहले शेल द्वारा एक्सपेंशन किया जाता है ( कमांड नहीं !) :
इसलिए वेरिएबल असाइनमेंट तब भी होता है (यदि लागू हो)।
इसके true
बजाय किसी अन्य कमांड का उपयोग करना या स्वीकार करना भी स्वीकार्य होगा :
, लेकिन कोड पढ़ना कठिन हो जाता है क्योंकि इरादा कम स्पष्ट होता है।
निम्नलिखित स्क्रिप्ट भी काम करेगी:
#!/bin/sh
# print the value of the VAR variable. Note that POSIX says the behavior
# of echo is implementation defined if the first argument is '-n' or if any
# argument contains a '\', so use printf instead of echo.
printf '%s\n' "VAR=${VAR=default value}"
लेकिन ऊपर बनाए रखने के लिए बहुत कठिन है। यदि ${VAR}
उस printf
लाइन के ऊपर एक लाइन का उपयोग किया जाता है , तो डिफ़ॉल्ट असाइनमेंट विस्तार को स्थानांतरित करना होगा। यदि डेवलपर उस असाइनमेंट को स्थानांतरित करना भूल जाता है, तो एक बग पेश किया जाता है।
खाली सशर्त ब्लॉक में कुछ डालना
खाली सशर्त ब्लॉकों को आमतौर पर टाला जाना चाहिए, लेकिन वे कभी-कभी उपयोगी होते हैं:
if some_condition; then
# todo: implement this block of code; for now do nothing.
# the colon below is a no-op to prevent syntax errors
:
fi
कुछ लोगों का तर्क है कि खाली सच्चे if
ब्लॉक होने से टेस्ट को नकारने की तुलना में कोड को पढ़ना आसान हो सकता है। उदाहरण के लिए:
if [ -f foo ] && bar || baz; then
:
else
do_something_here
fi
यकीनन पढ़ने में आसान है:
if ! [ -f foo ] || ! bar && ! baz; then
do_something_here
fi
हालाँकि मेरा मानना है कि कुछ वैकल्पिक दृष्टिकोण हैं जो एक खाली सच्चे ब्लॉक से बेहतर हैं:
एक समारोह में शर्त रखो:
exotic_condition() { [ -f foo ] && bar || baz; }
if ! exotic_condition; then
do_something_here
fi
घुंघराले ब्रेसिज़ (या कोष्ठक के अंदर स्थिति रखें, लेकिन कोष्ठक एक उप-प्रक्रिया की प्रक्रिया शुरू करते हैं और उपधारा के अंदर पर्यावरण में किए गए कोई भी परिवर्तन उपधारा के बाहर दिखाई नहीं देंगे) को नकारने से पहले:
if ! { [ -f foo ] && bar || baz; } then
do_something_here
fi
||
इसके बजाय का उपयोग करें if
:
[ -f foo ] && bar || baz || {
do_something_here
}
मैं इस दृष्टिकोण को पसंद करता हूं जब प्रतिक्रिया एक साधारण एक-लाइनर होती है, जैसे कि स्थिति को मुखर करना:
log() { printf '%s\n' "$*"; }
error() { log "ERROR: $*" >&2; }
fatal() { error "$@"; exit 1; }
[ -f foo ] && bar || baz || fatal "condition not met"