Я використовую таку модифікацію рішення 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
... | grep 0щоб значення повернення оболонки було 0, якщо БД не існує та 1, якщо воно є; або... | grep 1за протилежну поведінку