【Linux shell】while read line
迴圈中的重定向
或許你應該在其他指令碼中見過下面的這種寫法:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【shell】while read line 與for迴圈的區別While
- while read line 與for迴圈的區別While
- linux shell 互動, read 命令Linux
- while read line 程式碼中呼叫 ssh 檔案重定向問題.While
- shell指令碼while迴圈、read讀取控制檯輸入與函式指令碼While函式
- Linux Shell指令碼程式設計while語句案例Linux指令碼程式設計While
- [shell基礎]——read命令
- Shell程式設計-read命令程式設計
- Shell中Read用法簡介
- shell 中read命令的使用
- Linux Shell Awk 流程控制語句(if,for,while,do)詳細介紹LinuxWhile
- [Shell] 指令碼案例(1)--while,for,RANDOM,case指令碼Whilerandom
- [shell基礎]——if/for/while/until/case 語句While
- linux while 迴圈LinuxWhile
- [Shell] awk學習(4)-read input file
- Shell指令碼應用 – for、while迴圈語句指令碼While
- [python]檔案操作read&readline&readlinesPython
- Linux read命令Linux
- 05 Shell read讀取控制檯輸入
- shell程式設計控制結構expr/let/for/while/until程式設計While
- Oracle資料庫表空間READ ONLY、READ WRITE、ONLINE、OFFLINE狀態對應CHECKPOINT的變化Oracle資料庫
- linux系統下怎麼輸入EOF退出輸入迴圈while(getline(cin, temp)){.....}LinuxWhile
- Shell 語法 if 、 case 、for 、 while、 until 、select 、repeat、子函式While函式
- 重建控制檔案與 datafile offline,tablespace read only
- SAP:CX_SY_READ_SRC_LINE_TOO_LONG解決
- Linux ShellLinux
- linux read簡單用法Linux
- linux read 用法詳解Linux
- python中讀取檔案的read、readline、readlines方法區別Python
- Linux read命令的基本使用!Linux
- linux shell helloworldLinux
- root.sh / vipca: error while loading shared libraries: libpth read.so.PCAErrorWhile
- 表空間read only和online的狀態轉換
- 去掉pipeline中shell命令的除錯資訊除錯
- Linux Shell程式設計(27)——子shellLinux程式設計
- Python中read()、readline()和readlines()三者間的區別和用法Python
- 第十五章 SqlDataReader reader = comm.ExecuteReader(); while (reader.Read())SQLLDAWhile
- while read 迴圈中 呼叫ssh 遠端執行程式碼的一個超級大坑.While行程