while迴圈重定向只能讀取第一行

2021-07-03 01:24:30 字數 2627 閱讀 1151

今天碰到乙個ssh的問題,google之。原因如下:

需要讀取乙個文字,次文字每一行包含乙個ip在while迴圈中使用ssh,但ssh完第一行後就退出了,如何避免自動讀取一行就跳出while迴圈,此文將詳細解釋其原因。 

最近在寫乙個自動更新的shell,可是發現如果在使用while迴圈從乙個檔案中讀取ip位址,然後訪問就只能讀取第一行紀錄。**如下: 

1whilereadline

2do

3echo*******************************************$line

4ssh192.168.10.233ls

5done< data

但是如果使用for就沒有這個問題,非常的奇怪,for的**如下: 

1forlinein`catdata`

2do

3echo*******************************************$line

4ssh192.168.10.233ls

5done

難道for和while竟然有這麼大的差別,不可能吧。經過一番試驗以後發現,原來並不是while的for的差別,而是while中使用重定向機制,data檔案中的資訊都已經讀入並重定向給了整個while語句。所以當我們在while迴圈中再一次呼叫read語句,就會讀取到下一條記錄。問題就出在這裡,ssh語句正好回讀取輸入中的所有東西,下面這個shell能很好的說明這個問題: 

1whileread line

2do

3echo*******************************************$line

4ssh192.168.10.233cat

5done < data

執行這個shell就會發現,ssh中的cat語句會列印出data檔案中的其他紀錄,這就導致呼叫玩ssh語句後,輸入快取中已經都被讀完了,當read語句再讀的時候當然也就讀不到紀錄,迴圈也就退出了。改進方法是,將ssh的輸入重定向輸入: 

1whilereadline

2do

3echo*******************************************$line

4ssh192.168.10.233ls< /dev/null

5done< data

這樣,在while語句中也能順利的執行ssh語句了。linux的重定向還真複雜。

原文:

關於用Getline讀取檔案只能讀取首行的問題

自己再 中用getline讀取檔案時只能讀取首行,這個問題困擾了我很久,最開始我以為是函式沒有識別換行,任然再第一行讀取東西,但這個行getline這個函式的基本功能就相悖了,在稍作測試後我就換了其他思路,轉向其他方向。void readman list m,char filename int ar...

InputStream只能讀取一次的解決方法

有時候我們需要對同乙個inputstream物件使用多次。但第一次讀取inputstream物件後,第二次再讀取時可能已經到stream的結尾了 eofexception 或者stream已經close掉了。而inputstream物件本身不能複製,因為它沒有實現cloneable介面。此時,可以先...

當while遇到重定向 sh的陷阱

最近寫指令碼遇到乙個變數在while迴圈中重定向後丟掉的問題,經過幾番查詢,發現解決辦法,分享如下。以下內容來自網路。以下是我在程式設計時的親身體會 先看如下的程式 bin sh count 0 while read line docount expr count 1 done file echo ...