Ich verwende die folgende Modifikation der Arturo-Lösung:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
Was es macht
psql -l
gibt ungefähr 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 mit den Namen "Liste", "Zugriff" oder "Zeilen" erfolgreich ist. Daher leiten wir diese Ausgabe durch eine Reihe integrierter Befehlszeilentools, um nur in der ersten Spalte zu suchen.
Die -t
Flagge 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 das vertikale Pipe- |
Zeichen (das mit einem Backslash aus der Shell entfernt wurde) und wählt Feld 1 aus. Dies lässt Folgendes übrig:
my_db
postgres
template0
template1
grep -w
stimmt mit ganzen Wörtern überein und stimmt daher nicht überein, wenn Sie temp
in diesem Szenario suchen . Die -q
Option unterdrückt alle Ausgaben, die auf den Bildschirm geschrieben werden. Wenn Sie diese also interaktiv an einer Eingabeaufforderung ausführen möchten, können Sie die ausschließen, -q
damit sofort etwas angezeigt wird.
Beachten Sie, dass dies grep -w
mit alphanumerischen Zeichen, Ziffern und dem Unterstrich übereinstimmt. Dies ist genau der Zeichensatz, der in nicht zitierten Datenbanknamen in postgresql zulässig ist (Bindestriche sind in nicht zitierten Bezeichnern nicht zulässig). Wenn Sie andere Zeichen verwenden, grep -w
funktioniert dies nicht für Sie.
Der Exit-Status dieser gesamten Pipeline lautet 0
(Erfolg), wenn die Datenbank vorhanden ist, oder 1
(Fehler), wenn dies nicht der Fall ist. Ihre Shell setzt die spezielle Variable $?
auf den 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
... | grep 0
, dass der Shell-Rückgabewert 0 ist, wenn die Datenbank nicht vorhanden ist, und 1, wenn dies der Fall ist. oder... | grep 1
für das gegenteilige Verhalten