Linux Shell:read
命令
Linux Shell 的 read
命令是一个内置的用于接收标准输入(或文件输入)的命令。通过使用 read
命令,脚本可以交互式地读取用户输入的数据或从文件中读取数据。这个命令非常灵活,可以定制读取数据的方式,包括设置超时、读取特定数量的字符、以及处理分隔符。接下来,我们将深入探讨 read
命令的基本用法、高级特性以及常见的应用场景。
基本用法
read
命令的最基本形式是接收一行输入,并将其赋值给一个变量。如果不指定变量,输入将会被赋值到环境变量 REPLY
。
read var_name
当执行上面的命令时,Shell 会暂停执行,等待用户输入一行数据并按下回车。用户输入的数据将被存储在 var_name
变量中。
语法格式
root@m1-server:~# read --help
read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
Read a line from the standard input and split it into fields.
Reads a single line from the standard input, or from file descriptor FD
if the -u option is supplied. The line is split into fields as with word
splitting, and the first word is assigned to the first NAME, the second
word to the second NAME, and so on, with any leftover words assigned to
the last NAME. Only the characters found in $IFS are recognized as word
delimiters.
If no NAMEs are supplied, the line read is stored in the REPLY variable.
Options:
-a array assign the words read to sequential indices of the array
variable ARRAY, starting at zero
-d delim continue until the first character of DELIM is read, rather
than newline
-e use Readline to obtain the line
-i text use TEXT as the initial text for Readline
-n nchars return after reading NCHARS characters rather than waiting
for a newline, but honor a delimiter if fewer than
NCHARS characters are read before the delimiter
-N nchars return only after reading exactly NCHARS characters, unless
EOF is encountered or read times out, ignoring any
delimiter
-p prompt output the string PROMPT without a trailing newline before
attempting to read
-r do not allow backslashes to escape any characters
-s do not echo input coming from a terminal
-t timeout time out and return failure if a complete line of
input is not read within TIMEOUT seconds. The value of the
TMOUT variable is the default timeout. TIMEOUT may be a
fractional number. If TIMEOUT is 0, read returns
immediately, without trying to read any data, returning
success only if input is available on the specified
file descriptor. The exit status is greater than 128
if the timeout is exceeded
-u fd read from file descriptor FD instead of the standard input
Exit Status:
The return code is zero, unless end-of-file is encountered, read times out
(in which case it's greater than 128), a variable assignment error occurs,
or an invalid file descriptor is supplied as the argument to -u.
read
命令的基本语法格式如下所示,其中各个选项和参数的功能允许用户在读取输入时进行细致的控制:
read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
-
-e
选项启用 Readline 库,允许用户编辑输入行,包括使用左右箭头移动光标、使用退格键删除字符等功能。这在复杂的用户输入场景中非常有用,特别是当用户需要修改较长的输入时。 -
-r
选项告诉read
命令不将反斜线视为转义字符。在默认情况下,如果输入包含反斜线,它通常用作转义下一个字符的手段。使用-r
选项,反斜线将被视为普通字符。 -
-a array
选项允许将读入的数据分割成多个字段,并将这些字段依次赋值给名为array
的数组变量。这对于处理由空格、制表符或其他 IFS(内部字段分隔符)字符分隔的多部分输入非常有用。 -
-d delim
选项设置输入的终止字符,而不是默认的换行符。这允许read
在遇到指定的delim
字符时结束输入,使得可以在一行输入中使用特定字符来标记输入结束,而不仅仅是换行符。 -
-i text
选项在启用 Readline 编辑时提供一个初始文本,这对于预填充用户可能想要的默认响应非常有用,用户可以选择修改或直接接受该文本。 -
-n nchars
和-N nchars
选项分别用于指定read
应当读取的字符数。-n
在读取指定数量的字符后立即返回,即使没有遇到终止符;而-N
选项确保只在读取了确切的字符数后才返回,除非遇到 EOF 或超时。 -
-p prompt
选项允许直接在read
命令中指定提示符,这简化了脚本,因为不需要单独的echo
或printf
命令来显示提示信息。 -
-t timeout
选项设置一个超时限制(以秒为单位)。如果在指定时间内用户没有完成输入,read
命令将结束。这对于需要用户在一定时间内响应的脚本非常有用。 -
-u fd
选项允许read
从指定的文件描述符fd
而不是标准输入读取数据。这使得read
命令能够从文件或其他输入流中读取数据,为脚本提供了更大的灵活性。
选项和参数
read
命令提供了多个选项来定制其行为:
-p
:允许你指定一个提示符,直接在read
命令行显示,而不需要使用echo
命令先输出提示信息。-t
:设置一个超时值(秒)。如果在指定时间内没有输入,read
命令将会结束。-n
:指定读取字符的数量。read
将在读取到指定数量的字符后立即返回,而不是等待回车键。-s
:使输入的数据不在终端显示,这对于读取密码或敏感信息非常有用。-d
:设置一个结束字符。默认情况下,read
命令以换行符为结束标志,但可以使用-d
选项指定一个不同的结束字符。
示例
下面是一些 read
命令的实用示例:
读取输入并赋值给变量
read -p "请输入你的名字: " name
echo "欢迎,$name!"
设置超时等待
read -t 10 -p "你有 10 秒时间回答这个问题: " answer
if [ -z "$answer" ]; then
echo "抱歉,你没有在规定时间内回答。"
else
echo "你的答案是:$answer"
fi
隐藏输入(适用于密码)
read -s -p "请输入你的密码: " password
echo "密码已接收。"
读取特定数量的字符
read -n 2 -p "请输入两位数字: " number
echo "你输入的数字是:$number"