3
這是在bash中將多行輸入讀入數組的正確方法嗎?如何在bash shell腳本中將多行輸入讀入數組
arr=($(cat));
echo "{arr[@]}"
我把這個行成一個劇本,我試圖通過打每行後返回鍵讀取多個輸入,但劇本一直服用的輸入,並且不通過來第二打印數組的元素行,當我在輸入控制檯按ctrl C腳本終止。請建議如果是從命令行讀取多行輸入的正確方法?
這是在bash中將多行輸入讀入數組的正確方法嗎?如何在bash shell腳本中將多行輸入讀入數組
arr=($(cat));
echo "{arr[@]}"
我把這個行成一個劇本,我試圖通過打每行後返回鍵讀取多個輸入,但劇本一直服用的輸入,並且不通過來第二打印數組的元素行,當我在輸入控制檯按ctrl C腳本終止。請建議如果是從命令行讀取多行輸入的正確方法?
幾點來解決:
首先,不使用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
thanks gniourf_gniourf – Vicky