ファイルにファイル名のリストがあり、ユーザーが各ファイル名で何をするかを決定したいと思います。 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
その前に本当に必要なものがあります。=