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
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 "Liste," Accès "ou" lignes "réussira. Nous acheminons donc cette sortie à travers un ensemble d'outils de ligne de commande intégrés pour rechercher uniquement dans la première colonne.
L' -t
indicateur 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
Le bit suivant cut -d \| -f 1
divise la sortie par le |
caractère de tube vertical (é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. L' -q
option supprime toute sortie écrite à l'écran, donc si vous voulez l'exécuter de manière interactive à une invite de commande, vous pouvez avec pour exclure le -q
afin que quelque chose soit affiché immédiatement.
Notez qu'il grep -w
correspond aux caractères alphanumériques, aux chiffres et au trait de soulignement, qui est exactement le jeu de caractères autorisé dans les noms de base de données non entre guillemets dans postgresql (les tirets ne sont pas autorisés dans les identifiants non entre guillemets). Si vous utilisez d'autres personnages, grep -w
cela ne fonctionnera pas pour vous.
Le statut de sortie de tout 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 $?
sur 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
... | grep 0
pour que la valeur de retour du shell soit 0 si le DB n'existe pas et 1 s'il existe; ou... | grep 1
pour le comportement opposé