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

Postgres: creating role and password from CLI, nested quotes problems

我正在尝试从 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 创建角色?

'''$''' 毫无意义。它们等同于 '.

这是因为 '''foo' 被解析为空引号字符串 '' 紧跟另一个引号字符串 'foo',即 foo.

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

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

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

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

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

顺便说一句:您不需要 脚本,它在交互式shell 中同样有效。 (我只是用脚本测试了一下)