while read line
command | while read line;do command;done
-
read arg1 arg2 arg3 arg4 …,read是一個用來賦值的命令,它需要从目标输入获得值,然后把这些值按照位置依次赋值给变量arg1、arg2、arg3、arg4…,输入的时候以空格(可以有连续多个)作为分隔符
-
command命令的输出作为read循环的输入
,这种结构长用于处理超过一行的输出,当然awk也很擅长做这种事 -
read通过输入重定向,
把file的第一行所有的内容赋值给变量line
,
循环体内的命令一般包含对变量line的处理;然后循环处理file的第二行、第三行....一直到file的最后一行
。还记得while根据其后的命令退出状态来判断是否执行循环体吗?是的,read命令也有退出状态,当它从文件file中读到内容时,退出状态为0,循环继续惊醒;当read从文件中读完最后一行后,下次便没有内容可读了,此时read的退出状态为非0,所以循环才会退出 -
在读取文件时,for i in cat xx.txt 或者 for i in $(<file.txt);do done
效率最高,while中
while read line;do echo $line;done <test 效率最高
=============================================
# read 只有一个变量
[root@boy test]# cat line.txt
12 xxxx sdfsadf
34 xx
[root@boy test]# cat test.sh
#!/bin/bash
cat line.txt | while read line; #";" 必须要加,否则有问题
do
echo $line
done
# 执行结果,read 默认以空格(可以有很多个)来作为分割,将其分配给不同read后面的变量
[root@boy test]# bash test.sh
12 xxxx sdfsadf
34 xx
===========================================================
# read 有二个变量
[root@boy test]# cat line.txt
12 xxxx sdfsadf
34 xx
[root@boy test]# cat test.sh
#!/bin/bash
cat line.txt | while read line1 line2;
do
echo this is line1: $line1
echo this is line2: $line2
done
# 执行结果
[root@boy test]# bash test.sh
this is line1: 12
this is line2: xxxx sdfsadf
this is line1: 34
this is line2: xx
==============================================================
# read 有三个参数
[root@boy test]# cat line.txt
12 xxxx sdfsadf
34 xx
[root@boy test]# cat test.sh
#!/bin/bash
cat line.txt | while read line1 line2 line3;
do
echo this is line1: $line1
echo this is line2: $line2
echo this is line3: $line3
done
# 执行结果,可以见由于第二行无法满足分配给三个变量,默认给第三个变量分配了"空"
[root@boy test]# bash test.sh
this is line1: 12
this is line2: xxxx
this is line3: sdfsadf
this is line1: 34
this is line2: xx
this is line3:
" 空行 "
while read line;do echo $line;done < file
-
while中效率最高的,使用输入重定向的方式则每次只占用一行数据的内存,而且是在当前shell环境下执行的,while内的变量赋值、数组赋值在退出while后仍然有效
[root@boy test]# cat line.txt
12 xxxx sdfsadf
34 xx
[root@boy test]# cat test.sh
#!/bin/bash
while read line1 line2 line3
do
echo this is line1: $line1
echo this is line2: $line2
echo this is line3: $line3
done < line.txt
# 执行结果
[root@boy test]# bash test.sh
this is line1: 12
this is line2: xxxx
this is line3: sdfsadf
this is line1: 34
this is line2: xx
this is line3:
" 空行 "
版权声明:本文为qq_41586875原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。