bash:如何打破从sqlpus读取数据的while循环

时间:2016-06-08 18:58:22

标签: arrays oracle bash while-loop sqlplus

我正在尝试在循环中读取sqlplus的输出

while read -r line; do
  [commands] 
done < <(sqlplus -s ${user}/${pwd}@${database} @query.sql)

循环中的所有命令都能正常工作,但循环没有被关闭!

我已经尝试了几种解决方案,例如

done=0
while read -r line; do
  [commands] 
  if [ "$done" -ne 0 ]; then
      break
  fi
done < <(sqlplus -s ${user}/${pwd}@${database} @query.sql)

while read -r line || [[ -n "$line" ]]; do
  [commands] 
done < <(sqlplus -s ${user}/${pwd}@${database} @query.sql)

但是它们不起作用。

+我也检查过结果集的最后一行有\ n \ r \ n符号

如果有人可以帮助我理解为什么我列出了上述问题或建议使用其他方法 - 我将非常感激。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

进程替换扩展为特殊文件或FIFO的名称,可从中读取指定命令的输出。当没有更多的程序输出可用时,不一定会检测到文件结尾;这肯定不是FIFO预期的行为。

我认为你正在使用错误的工具来完成工作。您应该能够使用普通管道而不是进程替换来执行此任务:

sqlplus -s ${user}/${pwd}@${database} @query.sql | while read -r line; do
  [commands] 
done

只要sqlplus确实退出,read就会检测到EOF,导致循环退出。