आपको हमेशा सभी सूची संदर्भों में चर के आसपास उद्धरणों की आवश्यकता होती है, जो कि हर जगह चर को कई मूल्यों तक विस्तारित किया जा सकता है जब तक कि आप नहीं चाहते कि एक चर को छोड़ने के 3 दुष्प्रभाव।
सूची संदर्भों में साधारण आदेशों जैसे तर्क शामिल हैं [
या echo
, for i in <here>
सरणियों को असाइनमेंट ... अन्य संदर्भ हैं जहां चर भी उद्धृत किए जाने की आवश्यकता है। जब तक आपको बहुत अच्छा कारण नहीं मिल जाता है, तब तक हमेशा चर को उद्धृत करना सबसे अच्छा है।
विभाजित + ग्लोब ऑपरेटर के रूप में उद्धरण (सूची संदर्भों में) की अनुपस्थिति के बारे में सोचें ।
मानो echo $test
था echo glob(split("$test"))
।
शेल का व्यवहार अधिकांश लोगों को भ्रमित कर रहा है क्योंकि अधिकांश अन्य भाषाओं में, आप निश्चित स्ट्रिंग्स के आसपास उद्धरण देते हैं, जैसे कि puts("foo")
, और न ही चर के आसपास (जैसे puts(var)
) जबकि शेल में यह दूसरा तरीका है गोल: सब कुछ शेल में स्ट्रिंग है, इसलिए सब कुछ के आसपास उद्धरण डाल रहा है बोझिल हो जाएगा, आप echo test
, आप की जरूरत नहीं है "echo" "test"
। शेल में, उद्धरण कुछ और के लिए उपयोग किए जाते हैं: कुछ वर्णों के कुछ विशेष अर्थ को रोकते हैं और / या कुछ विस्तार के व्यवहार को प्रभावित करते हैं।
में [ -n $test ]
या echo $test
, खोल विभाजित कर देगा $test
(सभी का विस्तार (डिफ़ॉल्ट रूप से रिक्त स्थान पर), और फिर फ़ाइल नाम पीढ़ी प्रदर्शन *
मिलान फ़ाइलों की सूची के लिए, '?' ... पैटर्न), और फिर करने के लिए तर्क की उस सूची से पारित [
या echo
आदेशों ।
फिर से, के रूप में इसके बारे में सोचो "[" "-n" glob(split("$test")) "]"
। यदि $test
खाली है या केवल रिक्त स्थान (spc, tab, nl) शामिल है, तो विभाजन + ग्लोब ऑपरेटर एक खाली सूची लौटाएगा, इसलिए [ -n $test ]
वसीयत होगी "[" "-n" "]"
, जो कि wheter की जांच करने के लिए एक परीक्षण है "-n" खाली स्ट्रिंग है या नहीं। लेकिन सोचिए अगर $test
"*" या "= फू" हो तो क्या होता ...
में [ -n "$test" ]
, [
चार तर्क पारित हो जाता है "["
, "-n"
, ""
और "]"
(उद्धरण के बिना) है, जो है कि हम क्या चाहते हैं।
चाहे वह कोई अंतर रखता हो echo
या [
नहीं, यह सिर्फ echo
एक ही बात का उत्पादन करता है कि क्या यह एक खाली तर्क है या कोई तर्क नहीं है।
कमांड और निर्माण पर अधिक विवरण के लिए एक समान प्रश्न के लिए इस उत्तर को भी देखें ।[
[[...]]
echo
, तो अतिरिक्त रिक्त स्थान और नए अंक छीन लिए जाएंगे।