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 -tFlagge 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 1teilt 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 -wstimmt mit ganzen Wörtern überein und stimmt daher nicht überein, wenn Sie tempin diesem Szenario suchen . Die -qOption 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, -qdamit sofort etwas angezeigt wird.
Beachten Sie, dass dies grep -wmit 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 -wfunktioniert 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 1für das gegenteilige Verhalten