如何在bash for循环中执行psql命令

时间:2017-03-07 22:09:11

标签: linux bash

我想在bash脚本中执行psql语句并将结果输出到文件。我下面的代码按照需要工作:

#!/bin/bash

query="select * from mytable;"

psql <<EOF > output.txt
\timing
$query
EOF

我想运行该psql命令块5次,并将结果附加到output.txt。如果我只复制并粘贴它4次,它工作正常,但当我尝试将它放在for循环中时,我得到错误。有没有办法做到这一点?

这是我厌倦的循环:

#!/bin/bash

query="select * from mytable;"

for (( i=0; i<5; i++ ))
do
   psql <<EOF > output.txt
   \timing
   $query
   EOF
done

如果我将最后的EOF一直移到左边,它只会执行一次,好像循环不存在一样。

2 个答案:

答案 0 :(得分:5)

每次在循环中使用>覆盖文件。您需要在>>内部或在循环外部>

#!/bin/bash

query="select * from mytable;"
for (( i=0; i<5; i++ ))
do
   psql <<EOF
   \timing
   $query
EOF
done > output.txt

>之后设置done比在循环中设置>>更有效。

类似的帖子:

答案 1 :(得分:0)

通常最好不要循环运行Postgres。只需生成要执行的命令,然后运行生成的命令序列一次即可。

#!/bin/bash

query="select * from mytable;"

for (( i=0; i<5; i++ ))
do
   cat <<___EOF
   \timing
   $query
___EOF
done |
psql > output.txt

在这种情况下,当然可以简化为

#!/bin/bash
printf '-- %s\n\\timing\nselect * from mytable;\n' {1..5} |
psql >output.txt

括号扩展{1..5}是特定于Bash的,因此您不能为此特定代码段使用sh。 (There is a difference.