read命令

-- TOC --

read命令可以通过shell命令行获取用户输入,输入不会包含回车键。更准确地说,read命令从stdin按行读取。

read是bash的一个builtin命令。

常常见到read和echo命令配合获取用户输入:

$ echo -n 'your input:'; read in  # without $
your input:cs.pynote.net
$ echo $in
cs.pynote.net

其实,不用echo也可以,read命令的 -p 参数可以实现输入提示功能:

$ read -p 'your input: ' AA
your input: i am AA!
$ echo $AA
i am AA!

在使用-p参数的时候,后面可以不带变量,此时无论输入什么,只要回车就继续!用来实现press Enter to continue...这样的功能很方便。还可以配合下面介绍的-t参数,来设置一个超时。

read命令还可以同时实现一次输入多项数据:

$ read va vb vc  # all without $ 
11 22 33
$ echo $va
11
$ echo $vb
22
$ echo $vc
33

可以使用 -a 参数,用一个数组来接收用户输入的多个参数:

$ read -a A
1 6 2 7 4 9
$ for ((i=0;i<6;i++)); do echo ${A[$i]}; done
1
6
2
7
4
9

如果没有指定接收输入的变量,默认的环境变量$REPLY会保存read进来的数据:

$ read
cs.pynote.net
$ echo $REPLY
cs.pynote.net

read命令按行读取stdin,因此这也是在shell脚本读取stdin的方式:

$ cat tr.txt
test read
TEST2
line 3
$ read line < tr.txt
$ echo $line
test read

tr.txt文件中有3行内容,上例只是读取了第1行(每行末尾都有回车换行,每个回车换行对应一次read的输入),如果想每行都能读出来,如下:

$ while read line; do echo $line; done < tr.txt
test read
TEST2
line 3

在等待用户输入时,可以用 -t 参数设置一个超时的秒数,如果超时脚本就继续执行。用户没有输入,等效于那个用于接收输入的变量没有赋值,bash对于这类不存在的变量,一律按空来处理。

$ read -t 2 TT
$ echo -n $TT
$ 
$ if [ -z $TT ]; then echo '$TT is zero length'; fi
$TT is zero length
$ echo ${#TT}  # get the length of TT
0

-r 参数,raw,不对用户输入做转义。

-r do not allow backslashes to escape any characters

-u 参数,从一个file descriptor FD读取:

-u fd read from file descriptor FD instead of the standard input

-s 参数,在用户输入的时候,不回显出来:

-s do not echo input coming from a terminal

-n,设置输入最大长度,到这个长度就自动终止。

-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

本文链接:https://cs.pynote.net/sf/linux/shell/202110287/

-- EOF --

-- MORE --