【Bash】ループでファイル行を処理しつつ read でプロンプト表示

Bashが古い場合

標準入力とは異なるファイルディスクリプタを使えば逝けるらしい。

参考: Does bash support doing a read nested within a read loop?

while read -u 9 line
do
    read -p "Do you like ${HOGE}? [Y/n]" ANSWER
    .
    .
    .
done 9< hoge

Bash4.0 以上の場合

組み込みコマンドの mapfile をつかって、ファイルの中身を行ごとの配列にできる。 これを使えば、ループ内で read できる。

参考: 本を読む bash 4.0:テキストファイルを行単位で配列に読み込む

mapfile HOGE_LIST < hoge
for HOGE in "${HOGE_LIST[@]}"; do

    read -p "Do you like ${HOGE}? [Y/n]" ANSWER
    if echo "${ANSWER}" | egrep -Ei "^y.*"; then
        echo "Login succeeded."
    fi

done

普通にやると……

いつものようにファイル読み込みにも普通に read を使うと、 標準入力が爆発してループ内の read が正しく動かない。

cat hoge | while read line
do
    read -p "Do you like ${HOGE}? [Y/n]" ANSWER
    .
    .
    .
done