Забележка/актуализация (2021):Докато този отговор работи , философски съм съгласен с други коментари, че правилният начин да направите това е да попитате Postgres .
Проверете дали другите отговори, които имат psql -c
или --command
в тях са по-подходящи за вашия случай на употреба (напр. този на Никълъс Грили, Нейтън Осман, вариант на Брус или Педро
Използвам следната модификация на решението на Arturo:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
Какво прави
psql -l
извежда нещо като следното:
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)
Използването на наивния подход означава, че търсенето на база данни, наречена „Списък, „Достъп“ или „редове“, ще успее. Затова ние предаваме този изход през куп вградени инструменти на командния ред, за да търсим само в първата колона.
-t
флаг премахва горни и долни колонтитули:
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
Следващият бит, cut -d \| -f 1
разделя изхода чрез вертикалната тръба |
символ (избяга от обвивката с обратна наклонена черта) и избира поле 1. Това оставя:
my_db
postgres
template0
template1
grep -w
съвпада с цели думи и така няма да съвпада, ако търсите temp
в този сценарий. -q
опцията потиска всеки изход, написан на екрана, така че ако искате да стартирате това интерактивно в команден ред, можете да изключите -q
така че нещо се показва незабавно.
Обърнете внимание, че grep -w
съвпада с буквено-цифрови, цифри и долна черта, което е точно наборът от знаци, разрешен в имената на база данни без кавички в postgresql (тирета не са законни в идентификаторите без кавички). Ако използвате други знаци, grep -w
няма да работи за вас.
Изходното състояние на целия този конвейер ще бъде 0
(успех), ако базата данни съществува или 1
(провал), ако не е така. Вашият шел ще зададе специалната променлива $?
до изходното състояние на последната команда. Можете също да тествате състоянието директно в условно:
if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
# database exists
# $? is 0
else
# ruh-roh
# $? is 1
fi