2016-06-28 4 views
2

私はユーザーにbashスクリプトで特定の値を入力させようとしていますが、プロンプトは表示されません。bashスクリプトで特定の値を停止し強制的に入力する方法はありますか?

while IFS= read -r line; 
do 
until [ "$CONTINUE_EXECUTION" = "Y" -o "$CONTINUE_EXECUTION" = "N" ]; do 
    echo "Please press Y to continue or N to exit" 
    read CONTINUE_EXECUTION 
done 
echo $line 
done < xx2.txt 
+0

プロンプトが一度も表示されませんでしたか?変数CONTINUE_EXECUTIONは、ループの最初の反復で設定されている可能性があり、それ以降の反復で同じものを使用している可能性があります。あなたが 'Y'または' N'を入力すると、スクリプトは何もしません。 – Fazlin

+0

いいえ、それはしませんでした。私はテストのためにそのコードを内部に持つシェルスクリプトファイルdd1.shを作成しました。それは決してプロンプトされず、何とか無限ループで動作します – Nagma

+1

あなたは 'xx2.txt'からリダイレクトされているようです。そのリダイレクトは 'while'ループ内のすべてに適用されます。最後に ' cxw

答えて

3

スクリプト内の問題は両方read -r lineあるとread CONTINUE_EXECUTIONがxx2.txtファイルから読み込みます。 stdinxx2.txtにマッピングされ、両方ともreadがそこから入力を受け取ります。

1つの方法は、execを使用して新しいfdを作成し、read -uを使用してそのfdから読み取ることです。

exec 5<xx2.txt 
while read -u 5 line # read from xx2.txt 
do 
until [ "$CONTINUE_EXECUTION" = "Y" -o "$CONTINUE_EXECUTION" = "N" ]; do 
    read -p "Please press Y to continue or N to exit: " CONTINUE_EXECUTION 
     # read from stdin, which is the user's terminal at this point 
done 
echo $line 
CONTINUE_EXECUTION="" 
done 

PS:私は必要な変化の主要部分を説明したかったので、私はIFSのようにあなたのコードのいくつかの部分を削除しました。

+1

@cxw:コメントありがとう。 – Fazlin

+0

問題ありません:)。私はあなたの解決策を 'exec'で気に入っています---私はCygwin上で'/dev/console'を使いこなしていました。 – cxw

+0

ありがとう..働いた。 – Nagma

関連する問題