【问题标题】:How to execute a psql command within a bash for loop如何在 bash for 循环中执行 psql 命令
【发布时间】:2017-03-07 22:09:10
【问题描述】:

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

【问题讨论】:

  • &gt; output.txt 替换为&gt;&gt; output.txt

标签: bash loops


【解决方案1】:

您每次都在循环内使用&gt; 覆盖文件。你需要&gt;&gt; 在里面或者在循环外面有&gt;

#!/bin/bash

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

&gt; 放在done 之后比在循环中的&gt;&gt; 更有效。


类似帖子:

【讨论】:

    【解决方案2】:

    通常最好不要循环运行 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 用于这个特定的sn-p。 (There is a difference.)

    【讨论】:

      猜你喜欢
      • 2012-06-26
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多