【问题标题】:bash: How to break the while loop which reads data from sqlpusbash:如何打破从 sqlplus 读取数据的 while 循环
【发布时间】:2016-10-09 05:00:33
【问题描述】:

我正在尝试在循环中读取 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 符号

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

提前谢谢你。

【问题讨论】:

    标签: arrays oracle bash while-loop sqlplus


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 2016-08-06
      • 2013-08-31
      相关资源
      最近更新 更多