read:将資訊讀入一個或多個Shell變量
文法格式:read [-r] 變量名
選項:
-r:原始讀入,不做任何處理,不将結尾結尾處的反斜杠解釋為續行字元
行為模式:自标準輸入讀取資料後,通過Shell字段分隔的功能(使用$IFS)進行切分,第一個單詞賦給第一個變量,第二
個單詞賦給第二個變量,以此類推。如果單詞多與變量,則剩下的單詞,全賦給最後一個變量。read一旦遇到
檔案結尾(end-of-file),會以失敗值退出。
如果輸入行以反斜杠結尾,則read會丢棄反斜杠和換行字元,然後繼續讀取下一行。如果有-r選項,那麼read
就會以字面含義讀取最後的反斜杠。
linlin@ubuntu:~$ read TOM
cat
linlin@ubuntu:~$ echo $TOM
cat
linlin@ubuntu:~$ read JERRY MARRY
dog pear apple
linlin@ubuntu:~$ echo $JERRY
dog
linlin@ubuntu:~$ echo $MARRY
pear apple
警告:當将read使用在管道時,許多Shell會在一個分開的程序内執行它,在這種情況下,任何以read設定的變量,都不會
保留它們在父Shell裡的值,對管道中間的循環,也是這樣。
read最典型的用法是處理/etc/passwd檔案,可以使用簡單的循環逐行處理:
#!/bin/bash
#
while IFS=: read USER PASS UID GID FULLNAME HOMEDIR SEHLE
do
... 處理每個使用者
done < /etc/passwd
這個循環并不是說“當IPS等于冒号時,便讀取。。。”,而是通過IFS設定,讓read使用冒号作為分隔字元,而并不影響IFS
的值,它隻改變read所繼承的環境内的IFS值。
當遇到檔案尾時,read會以非零值退出,這個操作會使while循環終止。
将/etc/passwd的重定向放置于循環體的結尾有點奇怪,不過這是必須的,這樣才能使read在每次循環的時候看到後續的行,
如果循環寫成:
while IFS=: read USER PASS UID GID FULLNAME HOMEDIR SEHLE < /etc/passwd
do
... 處理每個使用者
done
循環就永遠不會終止,每次循環時,Shell都會在打開/etc/passwd一次,且read隻讀取檔案的第一行。
這種循環還有另一種替代的方式,就是在管道裡把cat和循環一起使用:
cat /etc/passwd |
while IFS=: read USER PASS USERID GROUPID FULLNAME HOMEDIR SEHLE
do
處理方式
done
小技巧:任何指令都能用來将輸入通過管道傳送給read。當read用在循環中時,這個方法格外有效。