पैरामीटर विस्तार
स्पष्ट उत्तर पैरामीटर विस्तार के विशेष रूपों में से एक का उपयोग करना है:
: ${STATE?"Need to set STATE"}
: ${DEST:?"Need to set DEST non-empty"}
या, बेहतर (नीचे 'डबल कोट्स की स्थिति' पर अनुभाग देखें):
: "${STATE?Need to set STATE}"
: "${DEST:?Need to set DEST non-empty}"
पहले संस्करण (बस का उपयोग करके ?
) को सेट करने की आवश्यकता होती है, लेकिन STATE = "" (एक खाली स्ट्रिंग) ठीक है - आप जो चाहते हैं वह ठीक नहीं है, लेकिन वैकल्पिक और पुराने अंकन।
दूसरे वेरिएंट (उपयोग :?
) के लिए DEST सेट और गैर-रिक्त होना आवश्यक है।
यदि आप कोई संदेश नहीं देते हैं, तो शेल एक डिफ़ॉल्ट संदेश प्रदान करता है।
${var?}
निर्माण संस्करण 7 यूनिक्स और बॉर्न शैल (1978 या आस) के लिए पोर्टेबल वापस आ गया है। ${var:?}
निर्माण से थोड़ा अधिक हाल है: मुझे लगता है इसे 1981 के लगभग प्रणाली III UNIX में था, लेकिन यह है कि इससे पहले कि PWB UNIX में हो सकता है। यह विशेष रूप से बैश सहित, कॉर्न शेल में और पोसिक्स के गोले में है।
इसे आमतौर पर शेल के मैन पेज में पैरामीशन एक्सपेंशन नामक सेक्शन में प्रलेखित किया जाता है । उदाहरण के लिए, bash
मैनुअल कहता है:
${parameter:?word}
अशक्त या परेशान होने पर त्रुटि प्रदर्शित करें। यदि पैरामीटर अशक्त या परेशान है, तो शब्द का विस्तार (या यदि शब्द मौजूद नहीं है तो उस आशय का संदेश) मानक त्रुटि और शेल को लिखा जाता है, यदि यह संवादात्मक नहीं है, तो बाहर निकलता है। अन्यथा, पैरामीटर का मान प्रतिस्थापित किया जाता है।
बृहदान्त्र कमान
मुझे शायद यह जोड़ना चाहिए कि बृहदान्त्र कमांड में बस अपने तर्कों का मूल्यांकन किया जाता है और फिर सफल होता है। यह मूल शेल टिप्पणी संकेतन है ( #
लाइन के अंत से पहले ' ')। लंबे समय तक, बॉर्न शैल लिपियों में पहले चरित्र के रूप में एक बृहदान्त्र था। सी शेल एक स्क्रिप्ट को पढ़ेगा और यह निर्धारित करने के लिए पहले वर्ण का उपयोग करेगा कि यह सी शेल ('ए #
' हैश) या बॉर्न शेल ('ए :
' कोलन) के लिए है या नहीं। तब कर्नेल को एक्ट में मिला और ' #!/path/to/program
' के लिए समर्थन जोड़ा और बॉर्न शेल को ' #
' टिप्पणियां मिलीं , और कोलन सम्मेलन रास्ते से चला गया। लेकिन अगर आप एक स्क्रिप्ट के साथ आते हैं, जो एक बृहदान्त्र से शुरू होती है, तो अब आपको पता चल जाएगा कि क्यों।
दोहरे भावों की स्थिति
ब्लोंग ने एक टिप्पणी में पूछा :
इस चर्चा पर कोई विचार? https://github.com/koalaman/shellcheck/issues/380#issuecomment-145872749
चर्चा का सार यह है:
… हालाँकि, जब मैं shellcheck
इसे (संस्करण 0.4.1 के साथ), मुझे यह संदेश मिलता है:
In script.sh line 13:
: ${FOO:?"The environment variable 'FOO' must be set and non-empty"}
^-- SC2086: Double quote to prevent globbing and word splitting.
इस मामले में मुझे क्या करना चाहिए, इस पर कोई सलाह?
संक्षिप्त उत्तर "जैसा shellcheck
कि सुझाव है" करें:
: "${STATE?Need to set STATE}"
: "${DEST:?Need to set DEST non-empty}"
वर्णन करने के लिए क्यों, निम्नलिखित का अध्ययन करें। ध्यान दें कि :
कमांड अपने तर्कों को प्रतिध्वनित नहीं करता है (लेकिन शेल तर्कों का मूल्यांकन करता है)। हम तर्कों को देखना चाहते हैं, इसलिए नीचे दिए गए कोड का उपयोग करता printf "%s\n"
है :
।
$ mkdir junk
$ cd junk
$ > abc
$ > def
$ > ghi
$
$ x="*"
$ printf "%s\n" ${x:?You must set x} # Careless; not recommended
abc
def
ghi
$ unset x
$ printf "%s\n" ${x:?You must set x} # Careless; not recommended
bash: x: You must set x
$ printf "%s\n" "${x:?You must set x}" # Careful: should be used
bash: x: You must set x
$ x="*"
$ printf "%s\n" "${x:?You must set x}" # Careful: should be used
*
$ printf "%s\n" ${x:?"You must set x"} # Not quite careful enough
abc
def
ghi
$ x=
$ printf "%s\n" ${x:?"You must set x"} # Not quite careful enough
bash: x: You must set x
$ unset x
$ printf "%s\n" ${x:?"You must set x"} # Not quite careful enough
bash: x: You must set x
$
ध्यान दें कि $x
पहले *
और फिर फ़ाइल नामों की एक सूची का विस्तार कैसे किया जाता है जब समग्र अभिव्यक्ति दोहरे उद्धरण चिह्नों में नहीं होती है। यह वही है जो shellcheck
अनुशंसा कर रहा है उसे ठीक किया जाना चाहिए। मैंने सत्यापित नहीं किया है कि यह उस फॉर्म पर आपत्ति नहीं करता है जहां अभिव्यक्ति दोहरे उद्धरणों में संलग्न है, लेकिन यह एक उचित धारणा है कि यह ठीक होगा।