-- 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 --