Obs/uppdatering (2021):Medan det här svaret fungerar , filosofiskt håller jag med andra kommentarer om att det rätta sättet att göra detta är att fråga Postgres .
Kontrollera om de andra svaren som har psql -c
eller --command
i dem är en bättre passform för ditt användningsfall (t.ex. Nicholas Grillys, Nathan Osmans, bruces eller Pedros variant
Jag använder följande modifiering av Arturos lösning:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
Vad den gör
psql -l
ger något i stil med följande:
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)
Att använda det naiva tillvägagångssättet innebär att sökningen efter en databas som heter "Lista, "Åtkomst" eller "rader" kommer att lyckas. Så vi skickar denna utdata genom ett gäng inbyggda kommandoradsverktyg för att bara söka i den första kolumnen.
-t
flaggan tar bort sidhuvuden och sidfötter:
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
Nästa bit, cut -d \| -f 1
delar utmatningen med det vertikala röret |
tecken (rymd från skalet med ett snedstreck) och väljer fält 1. Detta lämnar:
my_db
postgres
template0
template1
grep -w
matchar hela ord och matchar därför inte om du söker efter temp
i detta scenario. -q
alternativet undertrycker all utdata som skrivs till skärmen, så om du vill köra detta interaktivt vid en kommandotolk kan du utesluta -q
så något visas direkt.
Observera att grep -w
matchar alfanumeriska, siffror och understreck, vilket är exakt den uppsättning tecken som tillåts i databasnamn utan citattecken i postgresql (bindestreck är inte lagliga i identifierare utan citattecken). Om du använder andra tecken, grep -w
fungerar inte för dig.
Exitstatusen för hela denna pipeline kommer att vara 0
(framgång) om databasen finns eller 1
(misslyckande) om det inte gör det. Ditt skal kommer att ställa in den speciella variabeln $?
till utgångsstatus för det senaste kommandot. Du kan också testa statusen direkt i en villkorlig:
if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
# database exists
# $? is 0
else
# ruh-roh
# $? is 1
fi