Shell脚本深入教程:Bash read命令读数据
Bash read命令读数据
read命令是bash内置命令,用来从标准输入中读取数据。比如可以交互式读取用户在终端的输入,读取管道数据,读取标准输入重定向数据,等等。
读取文件中数据的方式:
- 按字符数读取
- 按分隔符读取
- 按行读取
- 一次性读完所有数据
- 按字节数读取(read命令不支持)
语法:
1 | read [-a aname] [-d delim] [-n nchars] |
示例
示例文件a.txt:
1 | cat a.txt |
1.按字符数读取
1 | while read -n 1 char;do echo $char;done <a.txt |
2.按分隔符读取
1 | while read -d "m" chars;do echo "$chars";done <a.txt |
5.读一行,并按IFS划分本行,将划分后的各个字段赋值给多个变量
1 | while read first second;do echo $first, $second;done < a.txt |
6.读一行,并按IFS划分本行,将划分后的各个字段保存在数组变量中
1 | while read -a arr;do echo ${arr[0]}, ${arr[1]};done < a.txt |
7.交互式提示用户输入姓名、年龄
1 | read -p "please give me your username and age:\n" user age |
8.从文件描述符中读取数据
1 | exec 3<> a.txt |
9.不指定保存所读数据的变量时,则默认保存在REPLY变量中
1 | read |
10.使用read的-t超时时间,模拟一个支持小数的sleep命令
1 | read_sleep() { |
使用read的优点
使用read命令,可以让Shell脚本实现比管道更简洁、更丰富的数据处理逻辑。比如:
1 | 使用管道,每个管道一次处理 |
使用read时的注意事项
注意事项1.不建议在管道中使用while read line
,因为管道会让命令在子Shell中执行,使得while中定义的变量退出while就失效了
1 | cat /etc/fstab | while read line;do |
取而代之的是使用标准输入重定向或进程替换。
1 | 标准输入重定向 |
注意事项2.读取内容中包含特殊符号时、包含前缀后缀空白时,要记得:
- (1).修改IFS变量:防止忽略前缀和后缀空白
- (2).read加-r选项:防止所读取内容中的反斜线执行转义行为
- (3).引用保存数据的变量时,加双引号保护,防止变量替换后特殊符号被解析
例如,如下示例文件a.txt内容:
1 | abc def |
不安全读取和安全读取:
1 | 不安全读取,输出的数据和原始数据不同 |
注意事项3:while read line的时候:
为什么不用
1 | while read line <a.txt;do |
而要用
1 | while read line;do |
因为前者会在每轮循环时都打开文件a.txt,使得每轮循环都只读取第一行内容,且无限循环。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 骏马金龙!
评论