2016-12-27 7 views
3

これは、複数行の入力をbashの配列に読み込む正しい方法ですか?bashシェルスクリプトで複数行の入力を配列に読み込む方法

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

私はスクリプトにこの行を入れて、私はそれぞれの行の後、リターンキーを押すことで、複数の入力を読み取ろうとしましたが、スクリプトが入力を取りに保持し、第二に来て配列の要素を印刷しません私が入力コンソールでctrl Cを押すと、スクリプトは終了します。コマンドラインから複数行の入力を読み取る正しい方法があるかどうかをご提案ください。対処する

答えて

6

いくつかの点:

まず、入力を終了するには、Ctrl-Cが、Ctrlキーを押しながらDを使用しない:Ctrlキーを押しながらCにCtrl-Dに対し、(それがSIGINT信号を送信する)スクリプトを中断しますEOF(送信の終了)です。それは単語分割とパス名展開の対象だから

​​

これは悪いです:

は、今、悪い方法を

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

を、配列、1行に1つのフィールドを印刷する使用するにしてみてくださいhello wordまたは*と入力すると、悪いことが起こることがわかります。

あなたが望むものを達成するために次のようにBash≥4であなたはmapfileを使用することができます。

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

や、レガシーバッシュで、あなたはループを使用することができます:あなたがしたい場合

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 
+0

ありがとうgniourf_gniourf – Vicky

関連する問題