如何将 bash 脚本中的长 psql 命令拆分为几行

如何将 bash 脚本中的长 psql 命令拆分为几行

我有一个很长的 psql 命令要在 bash shell 脚本中执行,我想知道将其拆分为几行的正确方法是什么?标准 Unix 脚本“分割线”反斜杠字符不起作用。当然,在 postgres 环境中,您可以继续一行一行地执行,直到您输入结束分号后才会处理该命令,但您不会在 shell 脚本中使用它。

我的命令是这样的:

sudo -u postgres /opt/puppet/bin/psql puppetdb -t -c "select certname, r.value as role, e.value as env from certname_facts r join certname_facts e using (certname) where r.name = 'role' and e.name = 'env' order by role,env,certname" | grep -v "^$" > /home/ansible/inventory_list

我不想更改命令,手动输入时一切正常,但我需要知道将其变成分行条目的正确方法,例如:

sudo -u postgres /opt/puppet/bin/psql puppetdb -t
-c "select certname, r.value as role, e.value as env
from certname_facts r join certname_faces e using (certname)
where r.name = 'role' and e.name = 'env'
order by role,env,certname" | grep -v "^$" > /home/ansible/inventory_list

请问有什么建议吗?

答案1

正如你所展示的那样,用反弹来分割它并没有什么错。但是,通常最好通过 stdin 发送 SQL。对于 postgres,尤其如此,因为“-c”选项被固定为仅从一个命令返回输出,而从 stdin 接受命令,您可以根据需要将任意多个命令堆叠在一起。所以,你会做类似的事情:

sudo -u postgres /opt/puppet/bin/psql puppetdb -t  <<SQL | ...
  select certname, r.value as role, e.value as env
      from certname_facts r join certname_faces e using (certname)
      where r.name = 'role' and e.name = 'env'
      order by role,env,certname
SQL

Bash 变量可能会在这里插入。为了避免这种情况,请引用第一个实例SQL

sudo -u postgres /opt/puppet/bin/psql puppetdb -t <<'SQL' | ...

答案2

抱歉,我只是尝试使用标准反斜杠字符并且它有效,所以:

sudo -u postgres /opt/puppet/bin/psql puppetdb -t \
-c "select certname, r.value as role, e.value as env \
from certname_facts r join certname_faces e using (certname) \
where r.name = 'role' and e.name = 'env' \
order by role,env,certname" | grep -v "^$" > /home/ansible/inventory_list

一位 DBA 同事告诉我,这是行不通的,因为它是一个 sql 命令,而不是一个“标准”Unix 命令。看来我应该先亲自尝试一下才相信!

答案3

如果您想做的只是输入基本查询,那么您将执行如下操作:

SELECT * 
FROM table_name ... 

然后你还有更多的东西——比如 WHERE 和 ORDER BY;像这样的东西——你想知道的是如何将其整齐地折叠在单独的行上,这样你就不仅仅是输入一行连续的查询,等等。

当您想转到下一行时,只需按 Enter 键即可。在您输入 .psql 文件之前,Psql 不会接受查询;

请记住,它区分大小写,但不区分空格,如下例所示:

mycomputer=# SELECT *
mycomputer-# FROM sacramento 
mycomputer-# WHERE beds <= 1
mycomputer-# LIMIT 20;

同样重要的是要知道,如果您输入无意义的内容,psql 将不会告诉您任何信息!它只会转到下一行。

另外,很高兴知道,如果您正在编写一个较长的查询,您知道您会再次使用,那么使用查询编辑文件并使用 .psql 调用它会更有效\i file_name

以下博客文章在入门时对我帮助很大:

命令行上的 postgresql

相关内容