いくつかの点:
まず、入力を終了するには、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
ありがとうgniourf_gniourf – Vicky