Postgres:从 CLI 创建角色和密码,嵌套引号问题

Posted

技术标签:

【中文标题】Postgres:从 CLI 创建角色和密码,嵌套引号问题【英文标题】:Postgres: creating role and password from CLI, nested quotes problems 【发布时间】:2017-05-14 18:21:44 【问题描述】:

我正在尝试从 bash 创建一个 postgres 角色和密码。但是,我似乎在为引号的转义而苦苦挣扎。

跑步:

$ sudo su - postgres -c '''psql -c "CREATE USER testuser WITH PASSWORD 'somepass';" '''

生产:

ERROR:  syntax error at or near "somepass"
LINE 1: CREATE USER testuser WITH PASSWORD somepass;

我尝试过的其他不成功的变体;

sudo su - postgres -c """psql -c "CREATE USER testuser WITH PASSWORD 'somepass';" """
sudo su - postgres -c $''' psql -c "CREATE USER testuser WITH PASSWORD \'pass\';" '''

如何处理嵌套引号,并让 postgres 从 cli 创建角色?

【问题讨论】:

【参考方案1】:

'''$''' 毫无意义。它们相当于'

这是因为'''foo' 被解析为一个空的带引号的字符串'',紧接着是另一个带引号的字符串'foo',即foo

要将单个' 放入单引号外壳字符串中,请使用'\''

sudo su - postgres -c 'psql -c "CREATE USER testuser WITH PASSWORD '\''somepass'\'';"'

这样做的原因:'foo'\''bar' 被解析为带引号的部分 ('foo'),后跟不带引号但反斜杠转义的字符 (\'),后跟另一个带引号的部分 ('bar')。这些都连接起来形成foo'bar

【讨论】:

【参考方案2】:

您可以通过使用此处文档来避免所有引用问题:

#!/bin/sh
sudo su - postgres -c psql <<OMG
CREATE USER testuser WITH PASSWORD 'somepass';
-- DROP USER testuser ;
OMG

顺便说一句:您不需要为此需要一个脚本,它在交互式外壳中也能正常工作。 (我只是用脚本测试了一下)

【讨论】:

以上是关于Postgres:从 CLI 创建角色和密码,嵌套引号问题的主要内容,如果未能解决你的问题,请参考以下文章

角色“postgres”不存在;无法创建用户

无法创建用户 postgres:角色“postgres”不存在

Postgres 不创建角色

如何创建一个访问受限、没有插入更新但可以执行重新索引和备份等维护任务的 postgres 角色?

postgresql数据库设置远程登陆账户和密码

Postgres:为不同角色/用户创建的未来表授予对角色/用户的访问权限