Uso la seguente modifica della soluzione di Arturo:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
Cosa fa
psql -l
produce 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 il piping di questo output attraverso una serie di strumenti incorporati della riga di comando per cercare solo nella prima colonna.
La -t
bandiera 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 |
carattere di pipe verticale (fuggito dalla shell con una barra rovesciata) e seleziona il campo 1. Questo lascia:
my_db
postgres
template0
template1
grep -w
corrisponde a parole intere e quindi non corrisponderà se stai cercando temp
in questo scenario. L' -q
opzione sopprime qualsiasi output scritto sullo schermo, quindi se si desidera eseguire questo in modo interattivo al prompt dei comandi, è possibile escludere -q
così che qualcosa venga visualizzato immediatamente.
Si noti che grep -w
corrisponde a caratteri alfanumerici, cifre e carattere di sottolineatura, che è esattamente l'insieme di caratteri consentiti nei nomi di database non quotati in postgresql (i trattini non sono legali negli identificatori non quotati). Se stai usando altri personaggi, grep -w
non funzionerà per te.
Lo stato di uscita dell'intera pipeline sarà 0
(successo) se il database esiste o 1
(errore) in caso contrario. La shell imposterà la variabile speciale $?
sullo 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
... | grep 0
per rendere il valore di ritorno della shell pari a 0 se il DB non esiste e 1 se lo è; o... | grep 1
per il comportamento opposto