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.
-t
Flag 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 1
dzieli 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 -w
dopasowuje całe słowa, więc nie będzie pasować, jeśli szukasz temp
w tym scenariuszu. Ta -q
opcja blokuje wszelkie dane wyjściowe zapisywane na ekranie, więc jeśli chcesz uruchomić to interaktywnie w wierszu polecenia, możesz wykluczyć to, -q
aby coś zostało natychmiast wyświetlone.
Zwróć uwagę, że grep -w
dopasowuje 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 -w
nie 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 0
aby wartość zwracana przez powłokę wynosiła 0, jeśli baza danych nie istnieje, i 1, jeśli tak; lub... | grep 1
dla odwrotnego zachowania