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