![使用 bash 与 psql 结合,在它们之间传递变量](https://linux22.com/image/1159618/%E4%BD%BF%E7%94%A8%20bash%20%E4%B8%8E%20psql%20%E7%BB%93%E5%90%88%EF%BC%8C%E5%9C%A8%E5%AE%83%E4%BB%AC%E4%B9%8B%E9%97%B4%E4%BC%A0%E9%80%92%E5%8F%98%E9%87%8F.png)
我正在编写一个使用 psql(Postgresql)的 bash 脚本。
DATABASE='scifi'
sudo -u postgres psql
count=SELECT COUNT(*) FROM (SELECT datname FROM pg_catalog.pg_database WHERE lower(datname)=lower($DATABASE)
如果存在的话,我想删除数据库,然后以相同的名称重新创建并分配给用户。
还有与 psql 相关的其他操作。
我的问题是,一旦我进入 psql,我就无法传递 bash 命令并检索信息。我有点理解为什么(因为我正在从 bash 转到 psql),但我必须找到解决方案。
答案1
您可以使用将单个命令作为字符串传递-c
,或者通过标准输入传递更复杂的命令序列,例如使用此文档:
sudo -u postgres psql << EOF
SELECT COUNT(*) FROM (
SELECT datname FROM pg_catalog.pg_database
WHERE lower(datname)=lower($DATABASE)
)
EOF
您可能需要引用或转义*
您不想扩展的 shell 特殊字符。
要捕获结果,请使用 shell 的$(...)
命令替换句法:
count=$(sudo -u postgres psql << EOF
SELECT COUNT(*) FROM (
SELECT datname FROM pg_catalog.pg_database
WHERE lower(datname)=lower($DATABASE)
)
EOF
)