2012-01-07 9 views
7

मैं एक सरणी के echo -e "a b\nc\nd e" जैसे कमांड के आउटपुट को कनवर्ट करने की कोशिश कर रहा हूं।बैश में लाइन द्वारा कमांड आउटपुट को एक सरणी रेखा में कैसे परिवर्तित करें?

X=($(echo -e "a b\nc\nd e")) 

विभाजन हर नई लाइन और रिक्त स्थान को चरित्र के लिए इनपुट:

$ echo ${#X[@]} 
> 5 

for i in ${X[@]} ; do echo $i ; done 
a 
b 
c 
d 
e 

परिणाम होना चाहिए:

for i in ${X[@]} ; do echo $i ; done 
a b 
c 
d e 
+0

संभव डुप्लिकेट http://stackoverflow.com/questions/8750848/how-do-i-create-an-array-in -bash-from-a-command-variable) – Cascabel

+0

कोई भी बेहतर डुप्लिकेट ढूंढने में सक्षम हो सकता है; यह सिर्फ सबसे हालिया है। इस सवाल को शायद कई बार पूछा गया है। – Cascabel

उत्तर

13

आप अपने आंतरिक फील्ड सेपरेटर चर बदलने की जरूरत है (IFS) पहले एक नई लाइन के लिए।

$ IFS=$'\n'; arr=($(echo -e "a b\nc\nd e")); for i in ${arr[@]} ; do echo $i ; done 
a b 
c 
d e 
+0

स्पष्टीकरण के लिए धन्यवाद। मैं सोच रहा हूं कि आप 'echo -e' का उपयोग क्यों करते हैं और न केवल' echo'। कोई कारण? – phs

+0

'-e' ध्वज बैकस्लैश से बचने वाले वर्णों की व्याख्या करने के लिए गूंजता है जैसे '\ n' एक शाब्दिक' \ n' – SiegeX

0

IFSnewline पर सेट करें। डिफ़ॉल्ट रूप से, यह space है।

[jaypal:~] while IFS=$'\n' read -a arry; do 
echo ${arry[0]}; 
done < <(echo -e "a b\nc\nd e") 
a b 
c 
d e 
की [मैं एक आदेश चर से बैश में एक सरणी कैसे बनाऊं?] (
+5

नहीं, डिफ़ॉल्ट रूप से यह' $ '\ t \ n'' है, रिक्त स्थान टैब और न्यूलाइन। – Cascabel

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