असाइनमेंट न्यूलाइन वर्णों को नहीं हटाता है, यह वास्तव में echoऐसा कर रहा है। आपको उन newlines को बनाए रखने के लिए बस स्ट्रिंग के चारों ओर उद्धरण लगाने की आवश्यकता है:
echo "$testvar"
यह wil आपको मनचाहा परिणाम देगा। डेमो के लिए निम्नलिखित प्रतिलेख देखें:
pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2
pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2
नए सिरे से स्पेस के साथ बदले जाने का कारण पूरी तरह से echoकमांड के साथ नहीं है , बल्कि यह चीजों का संयोजन है।
जब एक कमांड लाइन दी bashजाती है , तो इसे IFSचर के लिए प्रलेखन के अनुसार शब्दों में विभाजित किया जाता है :
IFS: आंतरिक क्षेत्र विभाजक जिसका उपयोग विस्तार के बाद शब्द विभाजन के लिए किया जाता है ... डिफ़ॉल्ट मान है <space><tab><newline>।
यह निर्दिष्ट करता है कि, डिफ़ॉल्ट रूप से, उन तीन वर्णों में से किसी का उपयोग आपकी कमांड को अलग-अलग शब्दों में विभाजित करने के लिए किया जा सकता है। उसके बाद, शब्द विभाजक चले गए हैं, आपके पास सभी शब्द शेष हैं।
echoप्रलेखन (एक bashआंतरिक कमांड) के साथ संयोजन करें , और आप देखेंगे कि रिक्त स्थान आउटपुट क्यों हैं:
गूंज [-neE] [arg ...]: रिक्त स्थान द्वारा अलग किए गए आर्ग्स को आउटपुट करें, इसके बाद एक नई रेखा।
जब आप उपयोग करते हैं echo "$x", तो यह पूरे xचर को एक शब्द के अनुसार होने के लिए मजबूर करता है bash, इसलिए यह विभाजित नहीं है। आप इसे देख सकते हैं:
pax> function count {
...> echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1
यहाँ, countफ़ंक्शन केवल दिए गए तर्कों की संख्या को प्रिंट करता है। 1 2 3और a b c dवेरिएंट इसे कार्य करता हुआ दिखा।
फिर हम इसे xचर पर दो भिन्नताओं के साथ आज़माते हैं । उद्धरण के बिना एक से पता चलता है कि चार शब्द हैं "test",,"1" , "test"और "2"। उद्धरण जोड़ने से यह एक एकल शब्द बन जाता है "test 1\ntest 2"।