Remarque/Mise à jour (2021) :Bien que cette réponse fonctionne , philosophiquement, je suis d'accord avec les autres commentaires que la bonne façon de faire est de demander à Postgres .
Vérifiez si les autres réponses qui ont psql -c
ou --command
ils sont mieux adaptés à votre cas d'utilisation (par exemple, la variante de Nicholas Grilly, Nathan Osman, bruce ou Pedro
J'utilise la modification suivante de la solution d'Arturo :
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
Ce qu'il fait
psql -l
affiche quelque chose comme ceci :
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+-----------+----------+------------+------------+-----------------------
my_db | my_user | UTF8 | en_US.UTF8 | en_US.UTF8 |
postgres | postgres | LATIN1 | en_US | en_US |
template0 | postgres | LATIN1 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | LATIN1 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
L'utilisation de l'approche naïve signifie que la recherche d'une base de données appelée "Liste, "Accès" ou "lignes" réussira. Nous dirigeons donc cette sortie via un ensemble d'outils de ligne de commande intégrés pour rechercher uniquement dans la première colonne.
Le -t
flag supprime les en-têtes et pieds de page :
my_db | my_user | UTF8 | en_US.UTF8 | en_US.UTF8 |
postgres | postgres | LATIN1 | en_US | en_US |
template0 | postgres | LATIN1 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | LATIN1 | en_US | en_US | =c/postgres +
| | | | | postgres=CTc/postgres
Le bit suivant, cut -d \| -f 1
divise la sortie par le tuyau vertical |
caractère (échappé du shell avec une barre oblique inverse) et sélectionne le champ 1. Cela laisse :
my_db
postgres
template0
template1
grep -w
correspond à des mots entiers et ne correspondra donc pas si vous recherchez temp
dans ce scénario. Le -q
L'option supprime toute sortie écrite à l'écran, donc si vous voulez l'exécuter de manière interactive à une invite de commande, vous pouvez exclure le -q
donc quelque chose s'affiche immédiatement.
Notez que grep -w
correspond à l'alphanumérique, aux chiffres et au trait de soulignement, qui est exactement l'ensemble de caractères autorisés dans les noms de base de données sans guillemets dans postgresql (les traits d'union ne sont pas autorisés dans les identifiants sans guillemets). Si vous utilisez d'autres caractères, grep -w
ne fonctionnera pas pour vous.
Le statut de sortie de l'ensemble de ce pipeline sera 0
(succès) si la base existe ou 1
(échec) si ce n'est pas le cas. Votre shell définira la variable spéciale $?
à l'état de sortie de la dernière commande. Vous pouvez également tester le statut directement dans un conditionnel :
if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
# database exists
# $? is 0
else
# ruh-roh
# $? is 1
fi