2016-12-27 40 views
3

這是在bash中將多行輸入讀入數組的正確方法嗎?如何在bash shell腳本中將多行輸入讀入數組

arr=($(cat)); 
echo "{arr[@]}" 

我把這個行成一個劇本,我試圖通過打每行後返回鍵讀取多個輸入,但劇本一直服用的輸入,並且不通過來第二打印數組的元素行,當我在輸入控制檯按ctrl C腳本終止。請建議如果是從命令行讀取多行輸入的正確方法?

回答

6

幾點來解決:

首先,不使用Ctrl-C,但按Ctrl-d以結束輸入:Ctrl-C鍵將打破腳本(它發送SIGINT信號),而按Ctrl-d是EOF(傳輸結束)。

要打印的陣列,每行一個字段,使用

printf '%s\n' "${arr[@]}" 

現在,壞的方式:

​​

這是不好的,因爲它受到字的拆分和路徑擴展:嘗試輸入hello word*,你會看到不好的事情發生。

達到你想要的東西:與Bash≥4你可以使用mapfile如下:

mapfile -t arr 
printf '%s\n' "${arr[@]}" 

,或者與傳統的Bash,你可以使用一個循環:

arr=() 
while IFS= read -r l; do 
    arr+=("$l") 
done 
printf '%s\n' "${arr[@]}" 

如果你想打印每一行,因爲它是打字,它可能更容易使用循環版本:

arr=() 
while IFS= read -r l; do 
    printf '%s\n' "$l" 
    arr+=("$l") 
done 

如果你感覺adv惹火,你可以使用mapfile的回調如下:

cb() { printf '%s\n' "$2"; } 
mapfile -t -c1 -C cb arr 
+0

thanks gniourf_gniourf – Vicky