J'utilise la modification suivante de la solution d'Arturo :
psql -lqt | cut -d \| -f 1 | grep -w <db_name> | wc -l
Ce qu'il fait
psql -l
produit quelque chose comme ce qui suit :
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 "List, "Access" ou "rows" aboutira. Nous faisons donc passer cette sortie par un ensemble d'outils de ligne de commande intégrés pour ne rechercher que dans la première colonne.
Le site -t
supprime les en-têtes et les 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
La suite, cut -d \| -f 1
divise la sortie par le tuyau vertical |
(échappé de l'interpréteur de commandes par 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. Et le wc -l
compte les lignes de matchine, en donnant 1 si le db existe, et 0 s'il n'existe pas.
Si vous préférez suivre la convention UNIX qui consiste à renvoyer un code de sortie plutôt que d'imprimer la sortie, laissez tomber l'option wc
du pipeline :
psql -lqt | cut -d \| -f 1 | grep -w <db_name>
L'état de sortie de ce pipeline sera 0
(succès) si la base de données 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 l'état directement dans une conditionnelle :
if psql -lqt | cut -d \| -f 1 | grep -w <db_name>; then
# database exists
# $? is 0
else
# ruh-roh
# $? is 1
fi