while循环返回一个额外的空行

时间:2017-07-12 21:57:48

标签: bash postgresql

我正在尝试编写一个bash脚本,列出我本地postgres db中的表

while read line
do 
   myarray+=("$line")
   ## debug
   echo $line
done  < <(psql -h ... -U ... -t -c "select distinct table_name from information_schema.columns where table_schema='myschema' ;") 

我创建了36个表,但上面的代码输出了第37行完全空白。我查看了echo ${#myarray[@]}之类的元素数量; 37个元素。

如果我运行查询select distinct table_name from information_schema.columns where table_schema='myschema' ;,我会收到36条记录。

我在while循环中使用进程替换方法,因为它似乎更快,但我认为错误来自那里。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

在Postgres代码中,对于所有输出格式,添加fputc('\n', fout);作为最终的无条件步骤,因此您需要将其过滤掉,例如:

while read line
do 
   myarray+=("$line")
   ## debug
   echo $line
done  < <(psql -h ... -U ... -t -c "select distinct table_name from information_schema.columns where table_schema='myschema' ;" \
           | egrep -v "^$") 

此外,请注意,如果将来您(或您的同事)将某些内容放到~/.psqlrc(例如,\timing on),则可能会破坏您的代码。要防止它,请使用psql的选项--no-psqlrc(或-X)。