2016-06-29 7 views
9

पर एकाधिक लाइन मान असाइन कैसे करें मेरे पास एक चर FOO है जिसके साथ एक मान के साथ असाइन किया जाना आवश्यक है जो एकाधिक रेखाएं होंगी। कुछ इस तरह,बैश वैरिएबल

FOO="This is line 1 
    This is line 2 
    This is line 3" 

तो जब मैं FOO का मूल्य प्रिंट यह निम्न उत्पादन देना चाहिए।

echo $FOO 
output: 
This is line 1 
This is line 2 
This is line 3 

इसके अलावा, लाइनों की संख्या गतिशील रूप से तय की जाएगी क्योंकि मैं इसे लूप का उपयोग करके प्रारंभ कर दूंगा।

मुख्य रूप से read -d का उपयोग कर अन्य प्रश्नों में दिखाए गए उत्तरों मेरे लिए उपयुक्त नहीं है क्योंकि मैं गहन स्ट्रिंग ऑपरेशन कर रहा हूं और कोड प्रारूप भी महत्वपूर्ण है।

+2

निकालें प्रमुख व्हाइटस्पेस: 'गूंज" $ foo "' – Cyrus

उत्तर

22

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

$ FOO="This is line 1 
This is line 2 
This is line 3" 
$ echo "$FOO" 
This is line 1 
This is line 2 
This is line 3 

एक और तरीका है \n भागने दृश्यों का प्रयोग है। उन्हें $'...' तारों के अंदर व्याख्या किया गया है।

$ FOO=$'This is line 1\nThis is line 2\nThis is line 3' 
$ echo "$FOO" 

एक तीसरा रास्ता पात्रों \ और n की दुकान, और फिर echo -e व्याख्या भागने दृश्यों है। यह एक सूक्ष्म अंतर है। महत्वपूर्ण हिस्सा यह है कि \n नियमित उद्धरणों के अंदर व्याख्या नहीं किया गया है।

$ FOO='This is line 1\nThis is line 2\nThis is line 3' 
$ echo -e "$FOO" 
This is line 1 
This is line 2 
This is line 3 

आप भेद अगर आप -e विकल्प को हटा दें और echo प्रिंट कुछ भी व्याख्या के बिना कच्चे स्ट्रिंग है मैं बना रहा हूं देख सकते हैं। लाइन 2 और 3 और उपयोग में

$ echo "$FOO" 
This is line 1\nThis is line 2\nThis is line 3 
+0

हाय जॉन, आपका उदाहरण कोड मेरे लिए काम करता है! हालांकि, ऊपर दिए गए पहले उदाहरण में, जब मैं उद्धरण चिह्नों के बीच $ FOO डाल दिए बिना '' 'echo $ FOO''' के साथ चर को प्रतिबिंबित करता हूं, तो आउटपुट एक ही पंक्ति पर होता है। तुम जानते हो क्यों? मैं जीएनयू बैश का उपयोग कर रहा हूं, संस्करण 4.3.11 (1) - उबंटू 14.04 पर कृपया। – yaobin

+0

ऐसा तब होता है जब आपके पास उद्धरण नहीं होते हैं। मान * शब्द विभाजन * और * ग्लोब विस्तार * के अधीन है। एम्बेडेड न्यूलाइन के साथ एक तर्क मुद्रित करने के लिए 'echo' के बारे में बताया जा रहा है,' $ FOO' का प्रत्येक शब्द कोई नईलाइन के साथ एक अलग तर्क बन जाता है। ऐसा लगता है जैसे आपने लिखा 'echo यह लाइन 1 है यह पंक्ति 2 है यह पंक्ति 3' है। निचली पंक्ति: हमेशा परिवर्तनीय विस्तार उद्धृत करें जबतक कि आप वास्तव में इसे शब्द विभाजन और ग्लोबिंग (दुर्लभ) के अधीन नहीं होना चाहते हैं। –

3

जब आप FOO प्रारंभ करते हैं तो आपको लाइन ब्रेक का उपयोग करना चाहिए: \n

FOO="This is line 1\nThis is line 2\nThis is line 3" 

फिर उत्पादन FOO करने के लिए echo -e का उपयोग करें।

यह शाब्दिक n के बाद ध्यान दें कि \n"..." अंदर एक लाइन ब्रेक नहीं है महत्वपूर्ण है, लेकिन शाब्दिक \,। यह है जब केवल echo -e द्वारा व्याख्या किया गया है कि यह शाब्दिक अनुक्रम एक न्यूलाइन वर्ण में परिवर्तित हो गया है। - से mklement0


#!/bin/bash 

FOO="This is line 1\nThis is line 2\nThis is line 3" 
echo -e $FOO 

Output: 
This is line 1 
This is line 2 
This is line 3 
+0

इसकी के रूप में देने के उत्पादन '-e यह पंक्ति 1 है इस लाइन 2 इस लाइन 3' – juned

+0

धन्यवाद है। यह मेरे लिए काम कर रहा है। – molecule

+2

@juned आपको 'echo' का एक संस्करण चाहिए जो '-e' का समर्थन करता है। बैश का अंतर्निहित गूंज कमांड करता है, जैसा कि जीएनयू की '/ bin/echo' बाइनरी करता है। –

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