2017-09-22 73 views
2

我很新的的bash腳本和這裏就是我想要做的事:如何在讀取文件時讀取while循環內的輸入?

1 - 讀取一個文件 - 該文件名 2的名單 - 詢問用戶是否要刪除(名稱) 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特異性,但我注意到您已經使用其他bash特異性特徵,-p選項read。從標準輸入以外的其他東西讀取的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