【发布时间】:2016-06-16 09:58:50
【问题描述】:
想问一些关于 bash 的问题。
在使用 while 循环时,我看到最后一行的使用如下所示:
完成
例如在读取文件时看到。
while read line; do
echo $line
done < file
我猜它正在根据一些布尔语句进行检查,但“文件”没有以任何方式改变。
这到底是什么意思?
【问题讨论】:
标签: bash
想问一些关于 bash 的问题。
在使用 while 循环时,我看到最后一行的使用如下所示:
完成
例如在读取文件时看到。
while read line; do
echo $line
done < file
我猜它正在根据一些布尔语句进行检查,但“文件”没有以任何方式改变。
这到底是什么意思?
【问题讨论】:
标签: bash
while read line; do
echo $line
done < file
这不是bash 特定的。它将文件重定向到循环的标准输入。在您展示的情况下,这将转到 read 命令。那么这有什么问题呢?
while read line < file # WRONG!
do
echo $line
done
这将产生一个无限循环。为什么?因为read line < file 读取file 的第一行。所以呢?好吧,它在循环的每次迭代中都会这样做,不断读取文件的第一行。这是因为它实际上是读取文件的第一行然后关闭文件,文件位置没有被保留。
循环只会在read 不成功(返回非零)时退出,这通常是在它到达文件结束 (EOF) 时。在错误的例子中它永远不会命中 EOF,它每次都成功读取第一行,所以我们得到一个无限循环。
语法也可以与函数一起使用(虽然你不经常看到它):
myfunc() {
while read line; do
echo $line
done
} < file
最后,检查你是否理解这一点,这里会发生什么?
while read line
do
echo "x" $line
cat
done < file
【讨论】:
使用
完整文档:Bash Redirections
【讨论】: