天天看點

【shell】while read line 與for循環的差別

【背景】

工作過程中遇到要從一個ip清單中擷取ip port,然後ssh ip 到目标機器進行特定的操作,但是編寫腳本的過程 使用while read line 讀取ip清單,在while循環中隻讀取第一個ip 後就退出腳本的情況。

【介紹】

解釋上面遇到的問題之前,先看到for 與while的測試對比,文中ip經過修改。

輸出結果如下:

由例子可見 while read line 是一次性将資訊讀入并指派給line ,而for是每次讀取一個以空格為分割符的字元串。

【原因】

while中使用重定向機制,IPS中的所有資訊都被讀入并重定向給了整個while 語句中的line 變量。是以當我們在while循環中再一次調用read語句,就會讀取到下一條記錄。問題就出在這裡,$line中的最後一行已經讀完,無法擷取下一行記錄,進而退出 while循環。

【解決方法】

1 使用ssh -n "command" 

2 ssh "cmd" < /dev/null 将ssh 的輸入重定向輸入。