Bemærk/opdatering (2021):Mens dette svar virker , filosofisk er jeg enig med andre kommentarer om, at den rigtige måde at gøre dette på er at spørge Postgres .
Tjek, om de andre svar, der har psql -c
eller --command
i dem passer bedre til din brug (f.eks. Nicholas Grilly's, Nathan Osman's, bruce's eller Pedro's variant
Jeg bruger følgende modifikation af Arturos løsning:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
Hvad det gør
psql -l
udsender noget i stil med følgende:
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)
At bruge den naive tilgang betyder, at det lykkes at søge efter en database kaldet "Liste, "Adgang" eller "rækker". Så vi sender dette output gennem en masse indbyggede kommandolinjeværktøjer for kun at søge i den første kolonne.
-t
flag fjerner sidehoveder og sidefødder:
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
Den næste bit, cut -d \| -f 1
opdeler output med det lodrette rør |
karakter (escaped fra skallen med en omvendt skråstreg), og vælger felt 1. Dette efterlader:
my_db
postgres
template0
template1
grep -w
matcher hele ord, og vil derfor ikke matche, hvis du søger efter temp
i dette scenarie. -q
option undertrykker ethvert output skrevet til skærmen, så hvis du ønsker at køre dette interaktivt ved en kommandoprompt, kan du med at udelukke -q
så noget bliver vist med det samme.
Bemærk at grep -w
matcher alfanumerisk, cifre og understregningen, som er præcis det sæt af tegn, der er tilladt i databasenavne uden anførselstegn i postgresql (bindestreger er ikke lovlige i identifikatorer uden anførselstegn). Hvis du bruger andre tegn, grep -w
virker ikke for dig.
Udgangsstatussen for hele denne pipeline vil være 0
(succes), hvis databasen eksisterer eller 1
(fejl), hvis det ikke gør det. Din shell vil indstille den specielle variabel $?
til udgangsstatus for den sidste kommando. Du kan også teste status direkte i en betinget:
if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
# database exists
# $? is 0
else
# ruh-roh
# $? is 1
fi