Nota/aggiornamento (2021):mentre questa risposta funziona , filosoficamente sono d'accordo con altri commenti sul fatto che il modo giusto per farlo è chiedere a Postgres .
Controlla se le altre risposte che hanno psql -c
o --command
in essi si adattano meglio al tuo caso d'uso (ad esempio la variante di Nicholas Grilly, Nathan Osman, bruce o Pedro
Uso la seguente modifica della soluzione di Arturo:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
Cosa fa
psql -l
restituisce qualcosa di simile al seguente:
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'uso dell'approccio ingenuo significa che la ricerca di un database chiamato "Elenco, "Accesso" o "righe" avrà esito positivo. Quindi eseguiamo questo output tramite una serie di strumenti da riga di comando integrati per cercare solo nella prima colonna.
Il -t
flag rimuove intestazioni e piè di pagina:
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
Il bit successivo, cut -d \| -f 1
divide l'output per il tubo verticale |
carattere (scappato dalla shell con una barra rovesciata) e seleziona il campo 1. Questo lascia:
my_db
postgres
template0
template1
grep -w
corrisponde a parole intere, quindi non corrisponderà se stai cercando temp
in questo scenario. Il -q
l'opzione sopprime qualsiasi output scritto sullo schermo, quindi se vuoi eseguirlo in modo interattivo al prompt dei comandi puoi escludere il -q
quindi qualcosa viene visualizzato immediatamente.
Nota che grep -w
corrisponde all'alfanumerico, alle cifre e al trattino basso, che è esattamente l'insieme di caratteri consentiti nei nomi di database senza virgolette in postgresql (i trattini non sono legali negli identificatori senza virgolette). Se stai usando altri caratteri, grep -w
non funzionerà per te.
Lo stato di uscita dell'intera pipeline sarà 0
(successo) se il database esiste o 1
(fallimento) se così non fosse. La tua shell imposterà la variabile speciale $?
allo stato di uscita dell'ultimo comando. Puoi anche testare lo stato direttamente in un condizionale:
if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
# database exists
# $? is 0
else
# ruh-roh
# $? is 1
fi