使用shell检查PostgreSQL中是否存在数据库

我想知道是否有人能告诉我是否可以使用shell检查PostgreSQL数据库是否存在

我正在制作一个shell脚本,我只希望它创建数据库,如果它还不存在,但到目前为止还无法看到如何实现它

注/更新(2021年):虽然这个答案有效,但从哲学上讲,我同意其他评论,即正确的方法是询问博士后

检查其中包含psql-c--command的其他答案是否更适合您的用例(例如Nicholas Grilly’s、Nathan Osman’s、bruce’s或Pedro’s变体


我使用以下对Arturo溶液的修改:

psql-lqt | cut-d\|-f1 | grep-qw<db|u name>


它做什么

psql-l输出如下内容:

数据库列表
姓名|所有者|编码|校对| Ctype |访问权限
———–+———–+———-+————+————+———————–
my|u db | my|u user | UTF8 | en|u US.UTF8 | en|u US.UTF8 |
博士后|博士后|拉丁1 | en|u US | en|u US |
template0 | postgres | LATIN1 | en|u US | en|u US |=c/postgres+
|| | | | postgres=CTc/postgres
模板1 | postgres | LATIN1 | en|u US | en|u US |=c/postgres+
|| | | | postgres=CTc/postgres
(4排)

使用朴素的方法意味着搜索名为“List”、“Access”或“rows”的数据库将成功。因此,我们通过一系列内置命令行工具来传递此输出,以便只搜索第一列


-t标志删除页眉和页脚:

my_db | my_user | UTF8 | en_US.UTF8 | en_US.UTF8 |
博士后|博士后|拉丁1 | en|u US | en|u US |
template0 | postgres | LATIN1 | en|u US | en|u US |=c/postgres+
|| | | | postgres=CTc/postgres
模板1 | postgres | LATIN1 | en|u US | en|u US |=c/postgres+
|| | | | postgres=CTc/postgres

下一位,cut-d\|-f 1通过垂直管道字符(用反斜杠从外壳转义)拆分输出,并选择字段1。这将留下:

我的数据库
博士后
模板0
模板1

grep-w匹配整个单词,因此如果在此场景中搜索temp,则不会匹配。-q选项会抑制写入屏幕的任何输出,因此如果您希望在命令提示下以交互方式运行此操作,则可以排除-q,以便立即显示某些内容

请注意,grep-w匹配字母数字、数字和下划线,这正是postgresql中不带引号的数据库名称所允许的字符集(连字符在不带引号的标识符中不合法)。如果使用其他字符,grep-w将不适用于您


如果数据库存在,则整个管道的退出状态将为0(成功),如果数据库不存在,则退出状态将为1(失败)。您的shell将把特殊变量$?设置为最后一个命令的退出状态。您还可以在条件中直接测试状态:

如果psql-lqt | cut-d \ |-f1 | grep-qw<db|u name>,那么
#数据库存在
#美元是0
其他的
#鲁卢
#美元是1
fi

发表评论