【Linux shell】while read line

haoge0205發表於2020-01-16

迴圈中的重定向

或許你應該在其他指令碼中見過下面的這種寫法:

while read line

do

       …

done < file

剛開始看到這種結構時,很難理解< file是如何與迴圈配合在一起工作的。因為迴圈內有很多條命令,而我們之前接觸的重定向都是為一條命令工作的。這裡有一個原則,這個原則掌握好了,這個問題就很簡單了:

對迴圈重定向的輸入可適用於迴圈中的所有需要從標準輸入讀取資料的命令;

對迴圈重定向的輸出可適用於迴圈中的所有需要向標準輸出寫入資料的命令;

當在迴圈內部顯式地使用輸入或輸出重定向,內部重定向覆蓋外部重定向。

上面的while結構中,read命令是需要從標準輸入中讀取資料的。我們來詳細瞭解一下read命令的用法吧,這個命令是shell指令碼中使用頻率最高的命令之一。

read

先來看一下read的命令語法:

read arg1 arg2 arg3 arg4 …

read是一個用來賦值的命令,它需要從標準輸入獲得值,然後把這些值按位置依次賦值給變數arg1、arg2、arg3、arg4…,輸入的時候以空格作為欄位分隔符。

read的一個最大特性是可以在指令碼中產生互動,因為它從標準輸入讀取資料。read之所以很常用,一是因為我們經常需要賦值,二是因為它可以互動,三是read能夠一次給多個變數賦值。

$ read host ip name

linux 10.0.0.1 licong

$ echo $host $ip $name

linux 10.0.0.1 licong

$

可以看到,linux、10.0.0.1、licong分別被賦值給了變數host、ip和name。再看:

$ read host ip

linux 10.0.0.1 licong

$ echo $host

linux

$ echo $ip

10.0.0.1 licong

$

當我們輸入的欄位比變數數目多時,最後一個變數的值將不只一個欄位,而是所有剩餘的內容;當輸入欄位比變數數少時,多餘的變數將是空值,你可以自己試試。現在我們再來看

while read line

do

       …

done < file

read透過輸入重定向,把file的第一行所有的內容賦值給變數line,迴圈體內的命令一般包含對變數line的處理;然後迴圈處理file的第二行、第三行。。。一直到file的最後一行。還記得while根據其後的命令退出狀態來判斷是否執行迴圈體嗎?是的,read命令也有退出狀態,當它從檔案file中讀到內容時,退出狀態為0,迴圈繼續執行;當read從檔案中讀完最後一行後,下次便沒有內容可讀了,此時read的退出狀態為非0,所以迴圈才會退出。

另一種也很常見的用法:

command | while read line

do

    …

done

如果你還記得管道的用法,這個結構應該不難理解吧。command命令的輸出作為read迴圈的輸入,這種結構長用於處理超過一行的輸出,當然awk也很擅長做這種事。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28939273/viewspace-2673706/,如需轉載,請註明出處,否則將追究法律責任。

相關文章