首頁 > 軟體

shell指令碼範例:read命令

2020-06-16 17:08:58

要與Linux互動,指令碼獲取鍵盤輸入的結果是必不可少的,read可以讀取鍵盤輸入的字元。

read [-rs] [-a ARRAY] [-d delim] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [var_name1 var_name2 ...]

read命令用於從標準輸入中讀取輸入單行,並將讀取的單行根據IFS變數分裂成多個欄位,並將分割後的欄位分別賦值給指定的變數列表var_name。第一個欄位分配給第一個變數var_name1,第二個欄位分配給第二個變數var_name2,依次到結束。如果指定的變數名少於欄位數量,則多出的欄位數量也同樣分配給最後一個var_name,如果指定的變數命令多於欄位數量,則多出的變數賦值為空。

如果沒有指定任何var_name,則分割後的所有欄位都儲存在特定變數REPLY中。

選項說明:
-a:將分裂後的欄位依次儲存到指定的陣列中,儲存的起始位置從陣列的index=0開始。
-d:指定讀取行的結束符號。預設結束符號為換行符。
-n:限制讀取N個字元就自動結束讀取,如果沒有讀滿N個字元就按下回車或遇到換行符,則也會結束讀取。
-N:嚴格要求讀滿N個字元才自動結束讀取,即使中途按下了迴車或遇到了換行符也不結束。其中換行符或回車算一個字元。
-p:給出提示符。例如,"-p 請輸入密碼:"
-r:禁止反斜線的跳脫功能。這意味著""會變成文字的一部分。
-s:靜默模式。輸入的內容不會回顯在螢幕上。
-t:給出超時時間,在達到超時時間時,read退出並返回錯誤。也就是說不會讀取任何內容,即使已經輸入了一部分。

使用範例:

(1).將讀取的內容分配給陣列變數,從索引號0開始分配。

[root@linuxidc ~]# read -a array_test
what is you name?    

[root@linuxidc ~]# echo ${array_test[@]}
what is you name?

[root@linuxidc ~]# echo ${array_test[0]}
what

(2).指定讀取行的結束符號,而不再使用換行符。

[root@linuxidc ~]# read -d '/'
what is you name //       # 輸入完尾部的"/",自動結束read

由於沒有指定var_name,所以通過$REPLY變數檢視read讀取的行。

[root@linuxidc ~]# echo $REPLY
what is you name /

(3).限制輸入字元。

例如,輸入了5個字元後就結束。

[root@linuxidc tmp]# read -n 5
12345

[root@linuxidc tmp]# echo $REPLY   # 輸入12345共5個字元
12345

如果輸入的字元數小於5,按下回車會立即結束讀取。

[root@linuxidc ~]# read -n 5
123

[root@linuxidc ~]# echo $REPLY
123

但如果使用的是"-N 5"而不是"-n 5",則嚴格限制讀滿5個字元才結束讀取。

[root@linuxidc ~]# read -N 5
123n4

[root@linuxidc ~]# read -N 5
123          # 3後的回車(換行)算是一個字元
4

(4).使用-p選項給出輸入提示。

[root@linuxidc ~]# read -p "pls enter you name: "
pls enter you name: Junmajinlong

[root@linuxidc ~]# echo $REPLY
Junmajinlong

(5).禁止反斜線跳脫功能。

[root@linuxidc ~]# read -r
what is you name ?

[root@linuxidc ~]# echo $REPLY
what is you name ?

(6).不回顯輸入的字元。比如輸入密碼的時候,不回顯輸入密碼。

[root@linuxidc ~]# read -s -p "please enter your password: "
please enter your password:

[root@linuxidc ~]# echo $REPLY
123456

(7).將讀取的行分割後賦值給變數。

[root@linuxidc ~]# read var1 var2 var3
abc def    galsl djks

[root@linuxidc ~]# echo $var1:::$var2:::$var3
abc:::def:::galsl djks

(8).給出輸入時間限制。沒完成的輸入將被丟棄,所以變數將賦值為空(如果在執行read前,變數已被賦值,則此變數在read超時後將被覆蓋為空)。

[root@linuxidc ~]# var=5

[root@linuxidc ~]# read -t 3 var
1

[root@linuxidc ~]# echo $var

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-08/146547.htm


IT145.com E-mail:sddin#qq.com