shell之while read line二种用法

  • Post author:
  • Post category:其他




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 版权协议,转载请附上原文出处链接和本声明。