while迴圈重定向只能讀取第一行
今天碰到一個ssh的問題,google之。原因如下:
需要讀取一個文字,次文字每一行包含一個IP在while迴圈中使用ssh,但ssh完第一行後就退出了,如何避免自動讀取一行就跳出while迴圈,此文將詳細解釋其原因。
最近在寫一個自動更新的shell,可是發現如果在使用while迴圈從一個檔案中讀取ip地址,然後訪問就只能讀取第一行紀錄。程式碼如下:
1 |
2 |
3 |
4 |
5 |
但是如果使用for就沒有這個問題,非常的奇怪,for的程式碼如下:
1 |
2 |
3 |
4 |
5 |
難道for和while竟然有這麼大的差別,不可能吧。經過一番試驗以後發現,原來並不是while的for的差別,而是while中使用重定向機制,data檔案中的資訊都已經讀入並重定向給了整個while語句。所以當我們在while迴圈中再一次呼叫read語句,就會讀取到下一條記錄。問題就出在這裡,ssh語句正好回讀取輸入中的所有東西,下面這個shell能很好的說明這個問題:
1 |
2 |
3 |
4 |
5 |
執行這個shell就會發現,ssh中的cat語句會打印出data檔案中的其他紀錄,這就導致呼叫玩ssh語句後,輸入快取中已經都被讀完了,當read語句再讀的時候當然也就讀不到紀錄,迴圈也就退出了。改進方法是,將ssh的輸入重定向輸入:
1 |
2 |
|