Opmerking/update (2021):Terwijl dit antwoord werkt , filosofisch ben ik het eens met andere opmerkingen dat de juiste manier om dit te doen is om het Postgres te vragen .
Controleer of de andere antwoorden met psql -c
of --command
daarin passen beter bij uw gebruikssituatie (bijv. Nicholas Grilly's, Nathan Osman's, Bruce's of Pedro's variant
Ik gebruik de volgende wijziging van Arturo's oplossing:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
Wat het doet
psql -l
geeft zoiets als het volgende weer:
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)
Het gebruik van de naïeve benadering betekent dat het zoeken naar een database met de naam "Lijst, "Toegang" of "rijen" zal slagen. Dus we sturen deze uitvoer door een aantal ingebouwde opdrachtregelprogramma's om alleen in de eerste kolom te zoeken.
De -t
vlag verwijdert kop- en voetteksten:
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
Het volgende bit, cut -d \| -f 1
splitst de uitvoer door de verticale pijp |
teken (uit de shell ontsnapt met een backslash), en selecteert veld 1. Dit laat:
my_db
postgres
template0
template1
grep -w
komt overeen met hele woorden, en komt dus niet overeen als u zoekt naar temp
in dit scenario. De -q
optie onderdrukt elke uitvoer die naar het scherm wordt geschreven, dus als u dit interactief wilt uitvoeren bij een opdrachtprompt, kunt u de -q
uitsluiten dus er wordt meteen iets weergegeven.
Merk op dat grep -w
komt overeen met alfanumeriek, cijfers en het onderstrepingsteken, wat precies de reeks tekens is die is toegestaan in niet-geciteerde databasenamen in postgresql (koppeltekens zijn niet legaal in niet-geciteerde identifiers). Als u andere tekens gebruikt, grep -w
werkt niet voor jou.
De exit-status van deze hele pijplijn is 0
(succes) als de database bestaat of 1
(falen) als dat niet het geval is. Je shell zal de speciale variabele $?
. instellen naar de exit-status van de laatste opdracht. U kunt de status ook rechtstreeks in een voorwaardelijke test testen:
if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
# database exists
# $? is 0
else
# ruh-roh
# $? is 1
fi