使用 bash 与 psql 结合,在它们之间传递变量

使用 bash 与 psql 结合,在它们之间传递变量

我正在编写一个使用 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 特殊字符。

PostgreSQL 9.4.19 文档


要捕获结果,请使用 shell 的$(...) 命令替换句法:

count=$(sudo -u postgres psql << EOF
SELECT COUNT(*) FROM (
  SELECT datname FROM pg_catalog.pg_database 
  WHERE lower(datname)=lower($DATABASE)
)
EOF
)

相关内容