whilereadline[linux]shell学习
循环中的重定向
或许你应该在其他脚本中见过下⾯的这种写法:
while read line
do
…
done < file
刚开始看到这种结构时,很难理解< file是如何与循环配合在⼀起⼯作的。因为循环内有很多条命令,⽽我们之前接触的重定向都是为⼀条命令⼯作的。这⾥有⼀个原则,这个原则掌握好了,这个问题就很简单了:
对循环重定向的输⼊可适⽤于循环中的所有需要从标准输⼊读取数据的命令;
对循环重定向的输出可适⽤于循环中的所有需要向标准输出写⼊数据的命令;
当在循环内部显式地使⽤输⼊或输出重定向,内部重定向覆盖外部重定向。
上⾯的while结构中,read命令是需要从标准输⼊中读取数据的。我们来详细了解⼀下read命令的⽤法吧,这个命令是shell脚本中使⽤频率最⾼的命令之⼀。
read
先来看⼀下read的命令语法:
linux重定向read arg1 arg2 arg3 arg4 …
read是⼀个⽤来赋值的命令,它需要从标准输⼊获得值,然后把这些值按位置依次赋值给变量arg1、arg2、arg3、arg4…,输⼊的时候以空格作为字段分隔符。
read的⼀个最⼤特性是可以在脚本中产⽣交互,因为它从标准输⼊读取数据。read之所以很常⽤,⼀是因为我们经常需要赋值,⼆是因为它可以交互,三是read能够⼀次给多个变量赋值。
$ read host ip name
linux 10.0.0.1 licong
$ echo $host $ip $name
linux 10.0.0.1 licong
$
可以看到,linux、10.0.0.1、licong分别被赋值给了变量host、ip和name。再看:
$ read host ip
linux 10.0.0.1 licong
$ echo $host
linux
$ echo $ip
10.0.0.1 licong
$
当我们输⼊的字段⽐变量数⽬多时,最后⼀个变量的值将不只⼀个字段,⽽是所有剩余的内容;当输⼊字段⽐变量数少时,多余的变量将是空值,你可以⾃⼰试试。现在我们再来看
while read line
do
…
done < file
read通过输⼊重定向,把file的第⼀⾏所有的内容赋值给变量line,循环体内的命令⼀般包含对变量line的处理;然后循环处理file的第⼆⾏、第三⾏。。。⼀直到file的最后⼀⾏。还记得while根据其后的命令退出状态来判断是否执⾏循环体吗?是的,read命令也有退出状态,当它从⽂件file中读到内容时,退出状态为0,循环继续惊醒;当read从⽂件中读完最后⼀⾏后,下次便没有内容可读了,此时read的退出状态为⾮0,所以循环才会退出。
另⼀种也很常见的⽤法:
command | while read line
do
…
done
如果你还记得管道的⽤法,这个结构应该不难理解吧。command命令的输出作为read循环的输⼊,这种结构长⽤于处理超过⼀⾏的输出,当然awk也很擅长做这种事。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论