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”不存在