read顾名思义就是读取数据,从用户输入读取信息存入指定变量中。

1. 默认读取,存放在REPLY

不指定存储变量时,默认存储在REPLY变量中

#!/usr/bin/env bash
# 文件名read.sh
read
echo '====='
echo $REPLY
$ ./read.sh
hello
=====
hello

2. 指定存储位置

#!/usr/bin/env bash
#文件名 read1.sh
read myvar
echo '====='
echo $myvar
$ ./read1.sh
hello
=====
hello

3. 增加提示输出

-p 提示信息

#!/usr/bin/env bash
# 文件名read2.sh
read -p 请输入姓名: name
echo '====='
echo $name
$ bash read2.sh
请输入姓名:zhangsan
=====
zhangsan

4. 读取多个字段

#!/usr/bin/env bash
# 文件名 read3.sh
read -p 请输入多个字段: name age sex
echo '========'
echo name = $name, age = $age, sex = $sex
  • 输入参数个数=接收变量个数
$ ./read3.sh
请输入多个字段:zhangsan 18 man
========
name = zhangsan, age = 18, sex = man
  • 输入参数个数>接收变量个数
    多余的数据将全部赋值给最后一个变量
$ ./read3.sh
请输入多个字段:zhangsan 18 man beijing@163.com
========
name = zhangsan, age = 18, sex = man beijing@163.com
  • 输入参数个数 < 接收变量个数
    没有获取到值的变量全部都为空
$ ./read3.sh
请输入多个字段:zhangsan 
========
name = zhangsan, age = , sex =

5. 指定输入超时时间

默认不超时,一直等待用户输入。
-t 超时秒数

#!/usr/bin/env bash
# 文件名read4.sh
read -t 10 -p 请输入姓名: name
echo '===='
echo $name

以下为未输入姓名,等待10s后,read自动返回,并且输出了====,并且name为空

$ bash read4.sh
请输入姓名:====
  • 如果判断是超时了呢?
    根据返回值,如果读取超时,则read的返回值大于128
#!/usr/bin/env bash
# 文件名read5.sh
read -t 10 -p 请输入姓名: name
ret=$?
if [ $ret -gt 128 ];then
	echo 'timeout'
else
	echo $name
fi
echo ret = $ret
$ ./read5.sh
请输入姓名:timeout
ret = 142
$ ./read5.sh
请输入姓名:zhangsan
zhangsan
ret = 0

6. 指定行分隔符

read读取一行,一行的默认分隔符为换行,可以指定其他分隔符
-d 分隔符

#!/usr/bin/env bash
# 文件名:read6.sh
read -d, -p 输入姓名,逗号结束: name
echo '========'
echo $name

换行被忽略,输入继续,至到输入逗号才结束,并且结果中包含了换行符(echo输出问题,导致看起来被替换成空格)可以通过echo -e "$name"进行还原。

$ bash read7.sh
输入姓名,逗号结束:zhangsan
wangwu
lisi
wanger,========
zhangsan wangwu lisi wanger

7. 关闭回显

正常输入时,将会把输入的数据回显在终端上,如果是输入密码,则所有人都会看到密码是什么,所以需要关闭回显。
-s可关闭

#!/usr/bin/env bash
# 文件名read8.sh
read -s -p 输入密码: password
echo -e '\n========' #为了增加一个换行,方便观察
echo $password
$ ./read8.sh
输入密码:
========
123456

8. 指定从文件中读取

以上的例子都是标准输入读取数据,也可以通过文件获取数据
-u 文件描述符

#!/usr/bin/env bash
# 文件名read9.sh
exec 3<read1.sh #打开read1.sh文件,并且赋予文件描述符3
read -u 3 myvar
echo $myvar
exec 3<&- #关闭文件描述符3
$ ./read9.sh
#!/usr/bin/env bash

9. 只返回特定个数字符

读取到N个字符就返回
-n 字符数 或者 -N 字符数

  • -n遇到行结束符则会退出,读取的数据可能比N小
#!/usr/bin/env bash
# 文件名read10.sh
exec 3<read1.sh #打开read1.sh文件,并且赋予文件描述符3
read -u 3 -n 40 myvar
echo -e "$myvar"
exec 3<&- #关闭文件描述符3

遇到行结束符了,一行读取结束,读取的结果小于20字符

$ ./read10.sh
#!/usr/bin/env bash
  • -N 则会忽略行结束符,一直读取,除非遇到EOF
#!/usr/bin/env bash
# 文件名read11.sh
exec 3<read1.sh #打开read1.sh文件,并且赋予文件描述符3
read -u 3 -N 40 myvar
echo -e "$myvar"
exec 3<&- #关闭文件描述符3
$ ./read11.sh
#!/usr/bin/env bash
# 文件名: read1.sh
read