ネストされた読み取りに失敗しました

ネストされた読み取りに失敗しました

ファイルにファイル名のリストがあり、ユーザーが各ファイル名で何をするかを決定したいと思います。 Bashでは、ファイル名自体を繰り返すのは簡単ではないので、次のようになりました。この回答:

#!/bin/bash

while IFS= read -r THELINE; 
do
  read -n 1 -p "Print line? [y/n] " answer;
  if [ ${answer} = "y" ];
  then
    echo "${THELINE}";
  fi;
done < tester;

空でないファイルでこれを実行しようとすると、次のエラーが発生しますif

line 5: [: =: unary operator expected

私の推測では、次のことが期待どおりに機能するため、「入れ子になった」方法で2回の呼び出しを使用して設定がanswer間違っている可能性があります。read

#!/bin/bash

for THELINE in $(cat "tester");
do
  read -n 1 -p "Print line? [y/n] " answer;
  if [ ${answer} = "y" ];
  then
    echo "${THELINE}";
  fi;
done;

ここで何が起こっているのでしょうか?

私はbash 4.2.24(1)-release (x86_64-pc-linux-gnu)走り続けています3.2.0-37-generic #58-Ubuntu x86_64 GNU/Linux

答え1

まず、エラーはisが空[answer[3つのパラメータが表示されるために発生します=。変数置換は常に二重引用符で囲みます()。y]if [ "$answer" = "y" ]

その理由は、whileループのリダイレクトのために空のfd 0がファイル$answer入力として忙しいからです。<tester

while IFS= read -r line <&3
do
    read -n 1 -p "Print line? [y/n] " answer
    if test "$answer" = "y"
    then
        echo "$line"
    fi
done 3< tester

答え2

努力するif [ x${answer} = "xy" ];testその前に本当に必要なものがあります。=

関連情報