[英]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.