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

4

我想在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移到最左边,它只会执行一次,好像循环不存在一样。

> output.txt 替换为 >> output.txt - codeforester
2个回答

5

您正在每次循环时使用>覆盖文件。 您需要在循环内使用>>,或者将>放在循环外:

#!/bin/bash

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

在循环内部使用>>相比在done之后使用>会更有效率一些。


类似的帖子:


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。(这里有一个区别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接