Я використовую таку модифікацію рішення 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
за протилежну поведінку