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