2016-06-08 54 views
0

我想在循環慶典:如何打破while循環讀取從sqlpus

while read -r line; do 
    [commands] 
done < <(sqlplus -s ${user}/${pwd}@${database} @query.sql) 

來讀取sqlplus的輸出數據和所有命令的循環工作正常,但環路沒有被關閉!

我已經嘗試已經有了一些解決方案,如

done=0 
while read -r line; do 
    [commands] 
    if [ "$done" -ne 0 ]; then 
     break 
    fi 
done < <(sqlplus -s ${user}/${pwd}@${database} @query.sql) 

while read -r line || [[ -n "$line" ]]; do 
    [commands] 
done < <(sqlplus -s ${user}/${pwd}@${database} @query.sql) 

但他們並沒有正常工作。

+還我檢查了結果集的最後一行\ n \ r符號

如果有人能幫助我理解了爲什麼我在上面列出的問題或建議使用一些其他的辦法 - 我我會非常感激。

預先感謝您。

回答

0

進程替換擴展爲特定文件或FIFO的名稱,從中可以讀取指定命令的輸出。當沒有更多的程序輸出可用時,並不一定會檢測到文件結束;這當然不是FIFO預期的行爲。

我認爲你使用的工具是錯誤的工具。您應該能夠使用普通的管道,而不是一個進程替換的完成這個任務:

sqlplus -s ${user}/${pwd}@${database} @query.sql | while read -r line; do 
    [commands] 
done 

只要sqlplus確實不退出,read會檢測EOF它這樣做後,引起循環退出。