簡體   English   中英

如何在bash shell腳本中讀取多行輸入到數組中

[英]how to read multiline input into an array in bash shell script

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

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

我把這一行放到一個腳本中,我嘗試通過在每一行之后按回車鍵來讀取多個輸入,但是腳本繼續接受輸入並且當我按下ctrl C時不會通過到達第二行來打印數組的元素在輸入控制台上腳本終止。 請建議從命令行讀取多行輸入的正確方法是否正確?

要點幾點:

首先,不要使用Ctrl-C而是使用Ctrl-D來結束輸入:Ctrl-C將破壞腳本(它發送SIGINT信號),而Ctrl-D是EOF(傳輸結束)。

要打印數組,每行一個字段,請使用

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

現在,糟糕的方式:

arr=( $(cat) )
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

如果您喜歡冒險,可以使用mapfile的回調,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM