【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 的輸入重定向輸入。
工作過程中遇到要從一個ip列表中獲取ip port,然後ssh ip 到目標機器進行特定的操作,但是編寫指令碼的過程 使用while read line 讀取ip列表,在while迴圈中只讀取第一個ip 後就退出指令碼的情況。
【介紹】
解釋上面遇到的問題之前,先看到for 與while的測試對比,文中ip經過修改。
點選(此處)摺疊或開啟
-
#/bin/bash
-
IPS="10.1.1.10 3001
-
10.1.1.10 3003
-
10.1.1.11 3001
-
10.1.1.11 3002
-
10.1.1.11 3004
-
10.1.1.11 3005
-
10.1.1.13 3002
-
10.1.1.13 3003
-
10.1.1.13 3004
- 10.1.1.14 3002"
-
echo "====while test ===="
-
i=0
-
-
echo $IPS | while read line
-
do
-
echo $(($i+1))
-
echo $line
-
done
-
-
-
echo "====for test ===="
-
n=0
-
for ip in $IPS ;
-
do
-
n=$(($n+1))
-
echo $ip
-
echo $n
- done
點選(此處)摺疊或開啟
-
====while test ====
-
1
-
10.1.1.10 3001 10.1.1.10 3003 10.1.1.11 3001 10.1.1.11 3002 10.1.1.11 3004 10.1.1.11 3005 10.1.1.13 3002 10.1.1.13 3003 10.1.1.13 3004 10.1.1.14 3002
-
====for test ====
-
10.1.1.10
-
1
-
3001
-
2
-
10.1.1.10
-
3
-
3003
-
4
-
10.1.1.11
-
5
-
3001
-
6
-
10.1.1.11
- ....
【原因】
while中使用重定向機制,IPS中的所有資訊都被讀入並重定向給了整個while 語句中的line 變數。所以當我們在while迴圈中再一次呼叫read語句,就會讀取到下一條記錄。問題就出在這裡,$line中的最後一行已經讀完,無法獲取下一行記錄,從而退出 while迴圈。
【解決方法】
1 使用ssh -n "command"
2 ssh "cmd" < /dev/null 將ssh 的輸入重定向輸入。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15797451/viewspace-2131986/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- while read line 與for迴圈的區別While
- 【js迴圈語句】for與while的區別JSWhile
- 【Linux shell】while read lineLinuxWhile
- 探討兩種迴圈表示方法的區別,while迴圈與for迴圈的小總結While
- shell指令碼while迴圈、read讀取控制檯輸入與函式指令碼While函式
- 資料型別——集合與while迴圈資料型別While
- while迴圈以及do while迴圈While
- C語言——迴圈結構(for迴圈,while迴圈,do-while迴圈)C語言While
- while迴圈While
- Shell指令碼應用 – for、while迴圈語句指令碼While
- while + else 使用,while死迴圈與while的巢狀,for迴圈基本使用,range關鍵字,for的迴圈補充(break、continue、else) ,for迴圈的巢狀,基本資料型別及內建方法While巢狀資料型別
- Python中for迴圈和while迴圈有什麼區別?Python入門教程PythonWhile
- while迴圈和do迴圈、緩衝區、一維陣列While陣列
- PHP For & While 迴圈PHPWhile
- Java 迴圈 - for, while 及 do…whileJavaWhile
- JavaScript中的while迴圈JavaScriptWhile
- 04流程控制 for迴圈,while迴圈While
- python while迴圈PythonWhile
- linux while 迴圈LinuxWhile
- while迴圈補充While
- mysql 中 while 迴圈的用法。MySqlWhile
- Java迴圈結構-for,while及do…whileJavaWhile
- Java while和do while迴圈詳解JavaWhile
- C#程式設計基礎第七課:C#中的基本迴圈語句:while迴圈、do-while迴圈、for迴圈、foreach迴圈的使用C#程式設計While
- python-while迴圈PythonWhile
- C語言程式設計學習中while迴圈和do……while迴圈C語言程式設計While
- JS中幾種迴圈的區別與相同點JS
- Java 迴圈結構 - for, while 及 do...whileJavaWhile
- ruby 怪異的while迴圈處理,和java的差別WhileJava
- C語言中迴圈語句while 中判斷條件出現 || 和 && 的區別C語言While
- Java入門學習-學習if & else,for迴圈,foreach迴圈,while迴圈的用法。JavaWhile
- c#入門-while迴圈C#While
- java學習之while迴圈JavaWhile
- Object-C,迴圈語句for,while,do-whileObjectWhile
- 當型迴圈和直到型迴圈有哪些區別
- while read 迴圈中 呼叫ssh 遠端執行程式碼的一個超級大坑.While行程
- python04: while迴圈語句 break continue for in 迴圈PythonWhile
- python 基礎習題6--for迴圈和while迴圈PythonWhile