2017-09-22 15 views
2

私はbashのスクリプトに非常に新しいですし、ここで私がやろうとしているものです:ファイルから読み込み中にwhileループ内の入力を読み取る方法はありますか?

1 - ファイルを読む - このファイルは名前 2のリストである - 彼らは{name}を削除したい場合はユーザーに依頼 3 - ユーザは、Yを入力した場合、これは私のスクリプトは、これまでに見えるものである

を続行:

while IFS= read -r repo 
    do 
     read -p "Do you want to delete $repo" ip 
     echo $ip 
     if [ "$ip" == "y" ] 
      then 
      #do something 
     fi 

    done < "$filename" 

read -p行は、ユーザープロンプトを待ちません。私はある種の問題を理解しており、このリンクを読んで解決しようとしていました。 - https://bash.cyberciti.biz/guide/Reads_from_the_file_descriptor_(fd)

しかし、何とか私はこの問題を解決できませんでした。私は間違って何をしていますか?助けてください!

答えて

4

名前付きファイルに別のファイル記述子を使用します。あなたはそのデータがどこから来ているかを知っています。標準入力がどこからリダイレクトされるかわからないので、そのままにしておきます。

while IFS= read -r -u 3 repo # Read from file descriptor 3 
do 
    read -p "Do you want to delete $repo" ip # Read from whatever standard input happens to be 
    echo "$ip" 
    if [ "$ip" = "y" ] 
    then 
     #do something 
    fi 
done 3< "$filename" # Supply $filename on file descriptor 3 

-ubash固有のですが、私はすでに、readから-pオプションを別のbash固有の機能を使用している注意してください。標準入力以外のものから読み取るPOSIX方法はIFS= read -r repo <&3です(このコマンドの標準入力にファイル記述子3をコピーします)。

+0

ありがとうございました!私は完全に "3"の部分を逃した!私はそれを最初に 'exec 3 <$ filename'と定義しました! :) – Saturnian

+1

ファイルを長く開いたままにする必要がない場合は、ループのリダイレクトを保持します。 – chepner

2

この質問を参照してください:

Does bash support doing a read nested within a read loop?

は基本的に、あなたが標準入力経由のファイルに読んでいるあなたが入力したときと同じ入力ストリームであるので、あなたは、ユーザーにプロンプ​​トを表示する場合、スクリプトがありますファイルの入力をユーザーの入力として扱います。代わりに、別の入力ストリームのファイルを読み込むと、それは上書きされません。

+0

はい!これはボンネットの下で行われていたことであることを理解するのに私はしばらくかかりました。ありがとうございました! – Saturnian

関連する問題