每天一個 Linux 命令:read 命令

1. 命令簡介

read 命令是 Shell 內建命令,用於從標準輸入或 -u 選項指定的文件描述符中讀取單行,並將讀取的單行根據 IFS 變量分割成多個字段,並將分割後的字段分別賦值給指定的變量列表。

第一個字段分配給第一個變量,第二個字段分配給第二個變量,以此類推。如果指定的變量名少於字段數量,則多出的字段連同分隔符分配給最後一個變量。

如果指定的變量多於字段數量,則多出的變量賦值爲空。如果沒有指定任何變量,則分割後的所有字段都存儲在特定變量 REPLY 中。

當然,read 讀取的內容不僅可以賦給變量,還可以賦給數組。

IFS(Internal Field Separator)變量是 Shell 內建的環境變量,用於將 read 命令讀取的單行內容分隔爲多個字段。默認取值爲空格、Tab 和換行符。

REPLY 變量也是 Shell 內建的環境變量,當 read 命令未指明接收變量時,用於接收 read 命令讀取的單行內容。

2. 命令格式

read [OPTIONS] [VARNAMES]

3. 選項說明

-a ANAME
  將分割後的字段依次存儲到指定的數組中,存儲的起始位置從數組的下標 0 開始
-d DELIM
  後跟一個分隔符,只有第一個字符有用,用以取代換行符作爲行的結束標誌
-e
  在輸入的時候可以使用命令補全功能,使用 Tab 鍵可自動補全當前目錄下文件
-i TEXT
  如果使用 readline 命令讀取行,則在開始編輯之前將文本放入編輯緩衝區
-n NCHARS
  後跟一個數字,定義輸入文本的長度,而不是讀取整行
-N NCHARS
  後跟一個數字,定義輸入文本的長度,而不是讀取整行。但是如果一行不足 nchars 個字符,則忽略行分隔符繼續讀取下一行
-p PROMPT
  從終端讀取輸入時,在輸入前打印提示信息
-r
  屏蔽反斜槓 \。如果沒有該選項,則 作爲一個轉義字符,有的話 就是個正常的字符了
-s
  靜默模式,輸入字符不顯示到屏幕,例如 login 時輸入密碼
-t TIMEOUT
  後面跟秒數,定義輸入字符的等待時間
-u FD
  後面跟文件描述符 fd,從文件描述符中讀取

4. 常用示例

(1)如果沒有指定變量,read 會把傳入的值傳給 REPLY,只要調用 REPLY 就可以引用 read 讀取的內容。

read; echo "\$REPLY:$REPLY"
dablelv
$REPLY:dablelv

(2)read 從終端讀取時指定一個提示語

[root@TENCENT64 ~]# 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

執行程序輸入密碼後是不顯示的:

請輸入您的密碼:
您輸入的密碼是 linuxhub

(6)讀取文件。每次調用 read 命令都會讀取文件中的一行文本。當文件沒有可讀的行時,read 命令將以非零狀態碼退出。

while read var1 var2
do
   echo $var1 $var2
done < file.txt

轉自:戀貓大鯉魚 blog.csdn.net/K346K346/article/details/83385774

****推薦關注「算法愛好者」,修煉編程內功

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/x0RyLrp767wtiWs02ocKcQ