असाइनमेंट न्यूलाइन वर्णों को नहीं हटाता है, यह वास्तव में 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"
।