2012-02-15 18 views
133

में एक सरणी में एक सीमांकित स्ट्रिंग पढ़ना मैं एक चर जो एक अंतरिक्ष-सीमांकित स्ट्रिंग है:बैश

line="1 1.50 string" 

मैं परिसीमक के रूप में अंतरिक्ष के साथ कि स्ट्रिंग विभाजित है और एक सरणी में परिणाम संग्रहीत करना चाहते हैं, तो निम्नलिखित है कि:

echo ${arr[0]} 
echo ${arr[1]} 
echo ${arr[2]} 

आउटपुट

1 
1.50 
string 

कहीं मैं एक समाधान है जो ऐसा नहीं करता पाया काम:

arr=$(echo ${line}) 

अगर मैं इस के बाद ऊपर गूंज बयान चलाने के लिए, मैं:

1 1.50 string 
[empty line] 
[empty line] 

मैं भी एक ही परिणाम के साथ की कोशिश की

IFS=" " 
arr=$(echo ${line}) 

। क्या कोई मदद कर सकता है, कृपया?

उत्तर

220
arr=($line) 

या

read -a arr <<<$line 
+26

+1। इस मामले में महत्वपूर्ण चरम को छोड़ने के लिए महत्वपूर्ण है। –

+4

और अपनी सुंदर नई सरणी की एक सैनिटी जांच करने के लिए: 'मैं $ {arr [@]} में; echo $ i करते हैं; किया गया ' – Banjer

+4

या सिर्फ' echo $ {arr [@]} ' – Banjer

32

इस प्रयास करें:

arr=(`echo ${line}`); 
+0

इसे ठीक करने के लिए धन्यवाद :) – Randy

+3

arr = ($ (echo $ {line})) –

+4

नाइस भी काम करता है - यह समाधान ज़ेड शैल में भी काम करता है जहां उपरोक्त कुछ अन्य दृष्टिकोण विफल हो जाते हैं। –

-7
line="1 1.50 string" 

arr=$($line | tr " " "\n") 

for x in $arr 
do 
echo "> [$x]" 
done 
+0

बिल्कुल काम नहीं कर रहा है। –

+0

लूपिंग गलत है, यह सरणी को ठीक से विभाजित करता है और पाइप 'tr' में अधूरा है लेकिन इसे '$ {arr [@]}' '' पर लूप करना चाहिए, इसके बजाय' $ arr' – Zorf

8

में: arr=($line)। "विभाजन" "ग्लोब" से जुड़ा हुआ है।
वाइल्डकार्ड (*, ? और []) मिलान फ़ाइल नामों में विस्तारित किया जाएगा।

सही समाधान केवल थोड़ा अधिक जटिल है:

IFS=' ' read -a arr <<<"$line" 

नहीं ग्लोबिंग समस्या; विभाजन चरित्र $IFS में सेट किया गया है, उद्धृत चर।