2016-12-30 1 views
0

J'essaie de créer un rôle postgres et un mot de passe de bash. Cependant, il semble que je me bats avec l'évasion des citations.Postgres: création d'un rôle et d'un mot de passe à partir de CLI, problèmes de citations imbriquées

Course à pied:

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

Produit:

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

Autres variations infructueuses que j'ai essayé; Comment puis-je gérer les guillemets imbriqués, et obtenir postgres pour créer le rôle à partir de cli?

Répondre

0

''' et $''' sont inutiles. Ils sont équivalents à '.

C'est parce que '''foo' est analysé comme une chaîne entre guillemets vide '' immédiatement suivie d'une autre chaîne entre guillemets 'foo', qui est juste foo.

Pour obtenir un ' dans une chaîne shell unique citée, utilisez '\'':

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

La raison pour laquelle cela fonctionne: 'foo'\''bar' est analysé comme une partie cité ('foo') suivie d'une non cotée, mais antislash échappé caractère (\') suivi d'une autre partie citée ('bar'). Ceux-ci sont tous concaténés pour former foo'bar.

+0

Fonctionne bien, merci! –

0

Vous pouvez éviter tous les citant des problèmes en utilisant un ici-document:

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

BTW: vous DonT besoin d'un script pour cela, il fonctionnera tout aussi bien dans un shell interactif. (Je viens d'utiliser le script pour le tester)