Stosuję następującą modyfikację rozwiązania Arturo:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
Co to robi
psql -l wyświetla coś podobnego do następującego:
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 te dane wyjściowe za pomocą zestawu wbudowanych narzędzi wiersza poleceń, aby wyszukiwać tylko w pierwszej kolumnie.
-tFlag usuwa nagłówków i stopek:
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 1dzieli dane wyjściowe za pomocą pionowej kreski |(uciekającej z powłoki z ukośnikiem odwrotnym) i wybiera pole 1. To pozostawia:
my_db
postgres
template0
template1
grep -wdopasowuje całe słowa, więc nie będzie pasować, jeśli szukasz tempw tym scenariuszu. Ta -qopcja blokuje wszelkie dane wyjściowe zapisywane na ekranie, więc jeśli chcesz uruchomić to interaktywnie w wierszu polecenia, możesz wykluczyć to, -qaby coś zostało natychmiast wyświetlone.
Zwróć uwagę, że grep -wdopasowuje znaki alfanumeryczne, cyfry i podkreślenie, co jest dokładnie zestawem 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 -wnie zadziała.
Status wyjścia tego całego potoku będzie 0(powodzenie), jeśli baza danych istnieje lub 1(błąd), jeśli tak nie jest. Twoja powłoka ustawi specjalną zmienną $?na kod zakończenia ostatniego polecenia. Możesz również sprawdzić status bezpośrednio w warunku:
if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
else
fi
... | grep 0aby wartość zwracana przez powłokę wynosiła 0, jeśli baza danych nie istnieje, i 1, jeśli tak; lub... | grep 1dla odwrotnego zachowania