2012-05-14 13 views
11

में बहु पंक्तिबद्ध तारों को कैसे गूंजें I कुछ टेम्पलेट भरने और उन्हें मेरे प्रोजेक्ट फ़ोल्डर में डालने के लिए कुछ स्क्रिप्ट बनाना चाहते हैं। मैं इसके लिए एक शेल स्क्रिप्ट का उपयोग करना चाहता हूं, और टेम्पलेट बहुत छोटे हैं इसलिए मैं उन्हें शेल स्क्रिप्ट में एम्बेड करना चाहता हूं। समस्या यह है कि echo मेरी स्ट्रिंग में लाइन ब्रेक को अनदेखा कर रहा है। या तो, या स्ट्रिंग में शुरू होने के लिए लाइन ब्रेक नहीं होते हैं।बोर्न शेल

MY_STRING=" 
Hello, world! This 
Is 
A 
Multi lined 
String." 

echo -e $MY_STRING 

यह आउटपुट:

Hello, world! This Is A Multi lined String.

मैं echo संभालने हूँ अपराधी यहाँ है यहाँ एक उदाहरण है। लाइन ब्रेक को स्वीकार करने के लिए मैं इसे कैसे प्राप्त कर सकता हूं?

+0

यह वास्तव में एक बोर्न शैल प्रश्न है (विशिष्ट बाश नहीं)। क्या आप तदनुसार शीर्षक संपादित करना चाहते हैं? – Jens

+1

जेन्स: बोल्ड बनें, आप इन संपादनों को स्वयं बना सकते हैं (जैसे मैंने अभी किया)। – tripleee

+0

@ ट्रिपली: बस अच्छा होना चाहता था और किसी के पैर की अंगुली पर कदम नहीं था। मैं इसके लिए जाऊंगा। – Jens

उत्तर

15

आपको परिवर्तनीय इंटरपोलेशन के चारों ओर डबल कोट्स की आवश्यकता है।

echo -e "$MY_STRING" 

यह एक बहुत ही आम त्रुटि है। आपको तारों को हमेशा उद्धृत करने की आदत में होना चाहिए, जब तक कि आपको विशेष रूप से व्हाइटस्पेस से अलग टोकन में विभाजित करने की आवश्यकता न हो या वाइल्डकार्ड का विस्तार न हो।

तो स्पष्ट होने के लिए, जब शेल आपकी कमांड लाइन को पार करता है तो शेल व्हाइटस्पेस को सामान्य कर देगा। यदि आप एक साधारण सी प्रोग्राम लिखते हैं तो आप इसे देख सकते हैं जो argv सरणी प्रिंट करता है।

argv[0]='Hello,' 
argv[1]='world!' 
argv[2]='This' 
argv[3]='Is' 
argv[4]='A' 
argv[5]='Multi' 
argv[6]='lined' 
argv[7]='String.' 

इसके विपरीत, के हवाले से, पूरी स्ट्रिंग argv[0], नई-पंक्तियों और सभी में है।

के लिए क्या इसके लायक है, यहां पर विचार दस्तावेजों (साथ cat, नहीं echo):

cat <<"HERE" 
foo 
Bar 
HERE 

तुम भी एक यहाँ दस्तावेज़ में एक चर को जोड़ सकते हैं।

cat <<HERE 
$MY_STRING 
HERE 

... हालांकि इस विशेष मामले में, यह शायद ही आप चाहते हैं।

+0

कूल, लेकिन क्या आप समझा सकते हैं कि मैं आपके उत्तर को सही क्यों चिह्नित करता हूं? संपादित करें: ओह ठीक है अब मैं इसे प्राप्त करता हूं। मैं भूल गया कि बैश अन्य स्क्रिप्ट भाषाओं – Hubro

+0

नोटिस संपादन की तरह स्ट्रिंग पास नहीं करता है। उम्मीद है की यह मदद करेगा। – tripleee

12

echo तो नब्बे के दशक है। The new (POSIX) kid on the block is printf

printf '%s\n' "$MY_STRING" 

नहीं -e या क्या प्रिंट हो कहाँ और कैसे व्यापक, जैसे सी सब लोग में कृपया अब printf का उपयोग शुरू और वापस देखो कभी नहीं दृश्यों से बचने के ऊपर SysV बनाम बीएसडी गूंज पागलपन पूरा नियंत्रण।

+1

+1, printf में बहुत अधिक आसान स्वरूपण हैं – Rony

संबंधित मुद्दे