Hel*_*enH 5 shell-script postgresql
我有一个很长的 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
Run Code Online (Sandbox Code Playgroud)
我不想更改命令,手动输入时一切正常,但我需要知道将其转换为分割线条目的正确方法,例如:
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
Run Code Online (Sandbox Code Playgroud)
请问有什么建议吗?
正如你所展示的那样,用强烈反对把它分开并没有错。但是,通常最好通过标准输入发送 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
Run Code Online (Sandbox Code Playgroud)
Bash 变量可能会在此处插入。为避免这种情况,请引用 的第一个实例SQL
:
sudo -u postgres /opt/puppet/bin/psql puppetdb -t <<'SQL' | ...
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10149 次 |
最近记录: |