需要讀取乙個文字,次文字每一行包含乙個ip在while迴圈中使用ssh,但ssh完第一行後就退出了,如何避免自動讀取一行就跳出while迴圈,此文將詳細解釋其原因。 最近在寫乙個自動更新的shell,可是發現如果在使用while迴圈從乙個檔案中讀取ip位址,然後訪問就只能讀取第一行紀錄。**如下:
while read line
do echo *******************************************$line
ssh 192.168.10.233 ls
done < data
但是如果使用for就沒有這個問題,非常的奇怪,for的**如下:
for line in `cat data`
do echo *******************************************$line
ssh 192.168.10.233 ls
done
難道for和while竟然有這麼大的差別,不可能吧。經過一番試驗以後發現,原來並不是while的for的差別,而是while中使用重定向機制,data檔案中的資訊都已經讀入並重定向給了整個while語句。所以當我們在while迴圈中再一次呼叫read語句,就會讀取到下一條記錄。問題就出在這裡,ssh語句正好回讀取輸入中的所有東西,下面這個shell能很好的說明這個問題:
while read line
do echo *******************************************$line
ssh 192.168.10.233 cat
done < data
執行這個shell就會發現,ssh中的cat語句會列印出data檔案中的其他紀錄,這就導致呼叫玩ssh語句後,輸入快取中已經都被讀完了,當read語句再讀的時候當然也就讀不到紀錄,迴圈也就退出了。改進方法是,將ssh的輸入重定向輸入:
while read line
do echo *******************************************$line
ssh 192.168.10.233 ls < /dev/null
done < data
這樣,在while語句中也能順利的執行ssh語句了。linux的重定向還真複雜。
參考博文:
在shell中使用while迴圈的例子
bin sh filename 2.sh b 9e 15 tmpb b while tmpb le e doecho tmpb tmpb expr tmpb 1 ok tmpb expr tmpb 1 done 執行這個指令碼後,輸出的結果為 910 1112 1314 15注意 第9行的功能和第1...
shell指令碼中使用while存在隱患
20170315uat 批量,在給零售通知書新增民生logo的作業中 發現執行報錯,但是指令碼繼續執行,並且排程圖上沒有反應報錯情況。經排查,發現shell指令碼中在使用的while語句用法存在著隱患,具體情況如下 cat file while read line do if ne 0 then e...
shell迴圈語句while
格式1 while 條件 do 執行命令 done 格式2 while 條件 do 命令done 例子 while 1 eq 1 do echo 這一步需要先修改 data screen config.py檔案 echo 是否確認已經修改,並繼續執行 yes no c if c yes then 啟...