Uwaga/aktualizacja (2021):chociaż ta odpowiedź działa , filozoficznie zgadzam się z innymi komentarzami, że właściwym sposobem na zrobienie tego jest zapytanie Postgresa .
Sprawdź, czy inne odpowiedzi, które mają psql -c
lub --command
w nich lepiej pasują do twojego przypadku użycia (np. wariant Nicholasa Grilly'ego, Nathana Osmana, bruce'a lub Pedro
Używam następującej modyfikacji rozwiązania Arturo:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
Co robi
psql -l
wyświetla coś takiego:
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)
Korzystanie z naiwnego podejścia oznacza, że wyszukiwanie bazy danych o nazwie „Lista, „Dostęp” lub „wiersze” zakończy się sukcesem. Dlatego przesyłamy to wyjście przez szereg wbudowanych narzędzi wiersza poleceń, aby przeszukiwać tylko pierwszą kolumnę.
-t
flaga usuwa nagłówki i stopki:
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
Następny bit, cut -d \| -f 1
dzieli wynik na pionową rurkę |
znak (uciekł z powłoki z odwrotnym ukośnikiem) i wybiera pole 1. Zostaje:
my_db
postgres
template0
template1
grep -w
dopasowuje całe słowa, więc nie będzie pasować, jeśli szukasz temp
w tym scenariuszu. -q
opcja wyłącza wszelkie dane wyjściowe zapisywane na ekranie, więc jeśli chcesz uruchomić to interaktywnie w wierszu poleceń, możesz wykluczyć -q
więc coś zostaje natychmiast wyświetlone.
Zauważ, że grep -w
dopasowuje znaki alfanumeryczne, cyfry i podkreślenie, które jest dokładnie zbiorem znaków dozwolonym w niecytowanych nazwach baz danych w postgresql (łączniki nie są dozwolone w niecytowanych identyfikatorach). Jeśli używasz innych znaków, grep -w
nie zadziała dla Ciebie.
Status wyjścia tego całego potoku to 0
(sukces), jeśli baza danych istnieje lub 1
(niepowodzenie), jeśli nie. Twoja powłoka ustawi specjalną zmienną $?
do statusu zakończenia ostatniego polecenia. Możesz również przetestować status bezpośrednio w trybie warunkowym:
if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
# database exists
# $? is 0
else
# ruh-roh
# $? is 1
fi