Hinweis/Update (2021):Während diese Antwort funktioniert , philosophisch gesehen stimme ich anderen Kommentaren zu, dass der richtige Weg, dies zu tun, darin besteht, Postgres zu fragen .
Überprüfen Sie, ob die anderen Antworten psql -c
enthalten oder --command
darin besser zu Ihrem Anwendungsfall passen (z. B. die Variante von Nicholas Grilly, Nathan Osman, Bruce oder Pedro
Ich verwende die folgende Modifikation von Arturos Lösung:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
Was es tut
psql -l
gibt etwa Folgendes aus:
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)
Die Verwendung des naiven Ansatzes bedeutet, dass die Suche nach einer Datenbank namens „List“, „Access“ oder „rows“ erfolgreich sein wird. Also leiten wir diese Ausgabe durch eine Reihe von integrierten Befehlszeilentools, um nur in der ersten Spalte zu suchen.
Das -t
Flag entfernt Kopf- und Fußzeilen:
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
Das nächste Bit, cut -d \| -f 1
teilt die Ausgabe durch den senkrechten senkrechten Strich |
Zeichen (von der Shell mit einem Backslash maskiert) und wählt Feld 1 aus. Dies hinterlässt:
my_db
postgres
template0
template1
grep -w
stimmt mit ganzen Wörtern überein und wird daher nicht übereinstimmen, wenn Sie nach temp
suchen In diesem Szenario. Das -q
Die Option unterdrückt jegliche Ausgabe, die auf den Bildschirm geschrieben wird. Wenn Sie diese also interaktiv an einer Eingabeaufforderung ausführen möchten, können Sie -q
ausschließen also wird sofort etwas angezeigt.
Beachten Sie, dass grep -w
stimmt mit alphanumerischen Zeichen, Ziffern und dem Unterstrich überein, was genau der Satz von Zeichen ist, die in Datenbanknamen ohne Anführungszeichen in postgresql zulässig sind (Bindestriche sind in Bezeichnern ohne Anführungszeichen nicht zulässig). Wenn Sie andere Zeichen verwenden, grep -w
wird für Sie nicht funktionieren.
Der Exit-Status dieser gesamten Pipeline ist 0
(Erfolg), wenn die Datenbank existiert oder 1
(Fehler), wenn nicht. Ihre Shell wird die spezielle Variable $?
setzen zum Exit-Status des letzten Befehls. Sie können den Status auch direkt in einer Bedingung testen:
if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
# database exists
# $? is 0
else
# ruh-roh
# $? is 1
fi