Linux命令(46)——read命令
1.命令簡介
read命令是Shell內建命令,用於從標準輸入或-u選項指定的檔案描述符中讀取單行,並將讀取的單行根據IFS變數分割成多個欄位,並將分割後的欄位分別賦值給指定的變數列表var_name。第一個欄位分配給第一個變數var_name1,第二個欄位分配給第二個變數var_name2,依次到結束。如果指定的變數名少於欄位數量,則多出的欄位連同分隔符分配給最後一個var_name,如果指定的變數命令多於欄位數量,則多出的變數賦值為空。如果沒有指定任何var_name,則分割後的所有欄位都儲存在特定變數REPLY中。當然,其不僅可以賦值變數,還可以賦值陣列。
IFS(Internal Field Separator)變數是Shell內建的環境變數,用於read命令將讀取的單行分隔為多個欄位。預設取值為。
REPLY變數也是Shell內建的環境變數,當read命令未指明接收變數時,用於接收read命令讀取的單行內容。
2.命令格式
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
3.選項說明
-a [aname]:將分裂後的欄位依次儲存到指定的陣列中,儲存的起始位置從陣列的下標0開始
-d [delim]:後跟一個標誌符,只有第一個字元有用,用以取代換行符作為行的結束標誌
-e:在輸入的時候可以使用命令補全功能,使用Tab鍵可自動不全當前目錄下檔案
-i [ text]:If readline is being used to read the line, text is placed into the editing buffer before editing begins
-n [nchars]:後跟一個數字,定義輸入文字的長度,而不是讀取整行
-N [nchars]:後跟一個數字,定義輸入文字的長度,而不是讀取整行。但是如果一行不足nchars個字元,則忽略行分隔符繼續讀取下一行
-p [prompt]:從終端讀取輸入時,在輸入前列印提示資訊
-r:遮蔽反斜槓\,如果沒有該選項,則\作為一個轉義字元,有的話\就是個正常的字元了
-s:安靜模式,在輸入字元時不再螢幕上顯示,例如login時輸入密碼
-t [ timeout]:後面跟秒數,定義輸入字元的等待時間
-u [fd]:後面跟檔案描述符fd,從檔案描述符中讀取
4.常用示例
(1)如果沒有指定變數,read會把傳入的值傳給REPLY就可以引用。
[[email protected] ~]# read;echo "\$REPLY:$REPLY"
dablelv
$REPLY:dablelv
(2)read從終端讀取時指定一個提示語
[[email protected]4 ~]# read -p"input u password:";echo "\$REPLY:$REPLY"
input u password:123456
$REPLY:123456
(3)-t引數指定 read 命令等待輸入的秒數,當計時滿時,read命令返回一個非零退出狀態碼。
#!/bin/bash
if read -t 5 -p "輸入網站名:" name
then
echo "你輸入的網站名是 $website"
else
echo "\n抱歉,你輸入超時了。"
fi
exit 0
執行程式不輸入,等待5秒後:
輸入網站名:
抱歉,你輸入超時了
(4)除了控制輸入時間,還可以使用-n選項控制輸入的字元數量。當輸入的字元數目達到預定數目時,自動退出,並將輸入的資料賦值給變數。例如只接收2個輸入就退出:
#!/bin/bash
read -n2 -p "請隨便輸入兩個字元: " any
echo "\n您輸入的兩個字元是:$any"
exit 0
(5)-s選項能夠使輸入的資料不顯示在命令終端上(實際上,輸入的內容是顯示的,只是read命令將文字顏色設定成與背景相同的顏色)。輸入密碼常用這個選項。
#!/bin/bash
read -s -p "請輸入您的密碼:" pass
echo "\n您輸入的密碼是 $pass"
exit 0
執行程式輸入密碼後是不顯示的:
請輸入您的密碼:
您輸入的密碼是 runoob
(6)讀取檔案
每次呼叫 read 命令都會讀取檔案中的 “一行” 文字。當檔案沒有可讀的行時,read 命令將以非零狀態退出。
while read var1 var2
do
echo $var1 $var2
done < file.txt