如果在 bash while 循环中调用,“read”不起作用

如果在 bash while 循环中调用,“read”不起作用

为什么这个 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并终止循环。

相关内容