为什么这个 while 循环内的 read 函数不起作用?如果我取消注释 echo(并注释 read),它会打印几次,但如果取消注释“read”,它只会退出函数。同样的“read”在循环外也能工作。
readTest()
{
ls -l | while read -r files; do
read -p "Continue? (Y/N): " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1
#echo "tttt"
done
}
答案1
read
行中的while
和循环体中的都read
将从管道读取,而不是从终端读取。 的输出与ls
模式不匹配,因此exit
将调用该命令。
解析的输出ls
很容易出错。你最好使用类似
for files in *; do
read -p "Continue? (Y/N): " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1
#echo "tttt"
done
这将避免内部的输入重定向read
。
如果不需要退出整个 shell 脚本,我建议使用break
或者return
代替exit
。
更详细的解释回答评论
在一个简化的例子中
ls | while read -r files; do
read confirm
done
并假设ls
印刷品
foo
bar
baz
在第一次迭代中,read -r files
将得到foo
,然后read confirm
将得到bar
,
在第二次迭代中,read -r files
将得到baz
,然后read confirm
将得到EOF,
在第三次迭代中,read -r files
将得到EOF并终止循环。