2012-01-07 104 views
7

我試圖將類似echo -e "a b\nc\nd e"的命令的輸出轉換爲數組。如何在bash中逐行轉換命令輸出到數組?

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

可能的重複[如何在命令變量的bash中創建數組?](http://stackoverflow.com/questions/8750848/how-do-i-create-an-array-in -bash-from-a-command-variable) – Cascabel 2012-01-07 14:31:57

+0

有人可能能夠找到更好的副本;這只是最近的一個。這個問題可能被問了幾十次。 – Cascabel 2012-01-07 14:32:15

回答

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 2015-09-04 16:18:10

+0

'-e'標誌告訴echo解釋反斜槓轉義字符,比如'\ n'輸出一個換行符與一個文字'\ n' – SiegeX 2015-09-05 19:07:22

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 2012-01-07 14:32:32