उद्धरण चिह्न "शब्द विभाजन" को रोकते हैं। वह यह है: व्हॉट्सएप वर्णों में कई मदों में चर को तोड़ना (या रिक्त स्थान, टैब पर और अधिक सटीक होना, डिफ़ॉल्ट $IFSशेल चर के मूल्य में परिभाषित के रूप में नया अंक )।
उदाहरण के लिए,
$ var="one two"
$ howmany(){ echo $#; }
$ howmany $var
2
$ howmany "$var"
1
यहां हम howmanyफ़ंक्शन को परिभाषित करते हैं जो हमें केवल यह बताता है कि कितने स्थितिगत पैरामीटर दिए गए हैं। जैसा कि आप देख सकते हैं, चर के लिए दो आइटम पारित किए जा रहे हैं, और उद्धरण के साथ चर में पाठ को एक इकाई माना जाता है।
यह सही जानकारी के पारित होने के लिए महत्वपूर्ण है। उदाहरण के लिए, यदि चर में फ़ाइल करने के लिए पथ है, और फ़ाइल नाम में पथ कहीं भी है, तो आप जिस कमांड को चलाने का प्रयास कर रहे हैं वह विफल हो सकता है या गलत परिणाम दे सकता है। यदि हम $varचर के साथ एक फ़ाइल बनाने की कोशिश कर रहे थे , touch $varतो दो फाइलें बनाएंगे, लेकिन touch "$var"सिर्फ एक।
वही आपके [ "$currentoutput" != "$lastoutput" ]हिस्से के लिए जाता है । यह विशेष परीक्षण दो तारों पर एक तुलना करता है। जब परीक्षण चलता है, तो [कमांड को 3 तर्क देखने होंगे - एक टेक्स्ट स्ट्रिंग, !=ऑपरेटर और दूसरा टेक्स्ट स्ट्रिंग। दोहरा उद्धरण रखने से शब्द विभाजन से बचा जाता है, और [कमांड वास्तव में उन 3 तर्कों को देखता है। अब यदि चर अयोग्य हैं तो क्या होगा?
$ var="hello world"
$ foo="hi world"
$ [ $var != $foo ]
bash: [: too many arguments
$
यहाँ, शब्द बंटवारा होता है, और इसके बजाय [दो तार helloऔर worldउसके !=बाद दो और तार दिखाई देते हैं hi world। मुख्य बिंदु यह है कि दोहरे उद्धरण चिह्नों के बिना, चर की सामग्री को एक पूरे आइटम के बजाय अलग-अलग इकाइयों के रूप में समझा जाता है।
आदेश प्रतिस्थापन के रूप में दोहरे उद्धरण चिह्नों की आवश्यकता नहीं है
var=$( df )
जहां आपके पास dfकमांड का आउटपुट सेव है var। हालांकि, यह हमेशा एक अच्छी आदत है $(...)कि जब तक आप वास्तव में आउटपुट को अलग-अलग वस्तुओं के रूप में व्यवहार नहीं करना चाहते हैं, तब तक डबल चर और कमांड प्रतिस्थापन को दोहराएं।
एक साइड नोट पर,
while [ true ]
हिस्सा हो सकता है
while true
[एक ऐसा कमांड है जो इसके तर्कों का मूल्यांकन करता है, और [ whatever ]जो भी अंदर है , उसकी परवाह किए बिना हमेशा सच होता है। इसके विपरीत, while trueकमांड का उपयोग करता है trueजो हमेशा सफलता से बाहर निकलने की स्थिति में लौटता है (और ठीक यही whileलूप की जरूरत है)। अंतर थोड़ा अधिक स्पष्टता और कम परीक्षण का है। वैकल्पिक रूप से, आप के :बजाय भी उपयोग कर सकते हैंtrue
echo "" date and Timeभाग में दोहरे उद्धरण चिह्नों को शायद हटाया जा सकता है। वे केवल एक खाली स्ट्रिंग सम्मिलित करते हैं और आउटपुट में अतिरिक्त स्थान जोड़ते हैं। यदि वह वांछित है, तो उन्हें वहां रखने के लिए स्वतंत्र महसूस करें, लेकिन इस मामले में कोई विशेष कार्यात्मक मूल्य नहीं है।
lsusb >> test.log
इस हिस्से को शायद बदला जा सकता है echo "$currentoutput" >> test.log। इसमें lsusbपहले से चलाए जाने के बाद दोबारा चलने का कोई कारण नहीं है currentoutput=$(lsusb)। ऐसे मामलों में जहां अनुरेखण में नई सुर्खियों
को संरक्षित करना पड़ता है - एक कमांड को कई बार चलाने में मूल्य को देख सकते हैं, लेकिन lsusbइसके लिए कोई आवश्यकता नहीं है। कम बाहरी कमांड जिसे आप कॉल करते हैं, बेहतर है, क्योंकि प्रत्येक गैर-इन-कमांड कमांड में हर कॉल सीपीयू, मेमोरी उपयोग और निष्पादन समय में खर्च होता है (भले ही कमांड संभवतः मेमोरी से प्री-लोडेड हैं)।
यह सभी देखें:
while [ true ]एक अनंत लूप का उत्पादन होता है, लेकिन शायद उस कारण के लिए नहीं जिसे आप सोचते हैं कि यह करता है; एक अनंत लूपwhile [ false ]भी पैदा करता है, क्योंकि एकल तर्क के साथ,[ ... ]यदि यह तर्क गैर-रिक्त स्ट्रिंग है तो सफल होता है।while trueवास्तव में एक कमांड चलाएगा जिसका नाम हैtrue(जो हमेशा सफल होता है)।