2017-07-12 30 views
0

我試圖寫一個bash腳本,列出我的本地的Postgres表DBwhile循環將返回一個額外的空行

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循環中使用過程替換方法,因爲它看起來更快,但我認爲錯誤來自那裏。有任何想法嗎?

+0

循環似乎是矯枉過正。難道你不能只說'myarray =($(psql ...))'? –

+1

你檢查過'psql'的輸出嗎?它最後有兩個換行符還是\ r \ n?你可以發佈'psql ... |的輸出嗎? hd'(十六進制轉儲)? – ideaboxer

+1

除非你希望在輸出中間有空行(並且你想保留它們),那麼你可以添加(warning:bashism)'[[「$ line」=〜^ [[:space:]] * $]] && continue'在循環的頂部。 –

回答

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)。

+1

哇。這是完全合理的。接受並投票決定。謝謝! – Alan