Observação/atualização (2021):enquanto esta resposta funciona , filosoficamente concordo com outros comentários de que a maneira correta de fazer isso é perguntar ao Postgres .
Verifique se as outras respostas que possuem
psql -c
ou --command
neles são mais adequados para o seu caso de uso (por exemplo, a variante de Nicholas Grilly, Nathan Osman, bruce ou Pedro Eu uso a seguinte modificação da solução de Arturo:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
O que faz
psql -l
emite algo como o seguinte: 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)
Usar a abordagem ingênua significa que a busca por um banco de dados chamado "Lista, "Acesso" ou "linhas" será bem-sucedida. Assim, canalizamos essa saída por meio de várias ferramentas de linha de comando integradas para pesquisar apenas na primeira coluna.
O
-t
flag remove cabeçalhos e rodapés: 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
O próximo bit,
cut -d \| -f 1
divide a saída pelo tubo vertical |
caractere (escapado do shell com uma barra invertida) e seleciona o campo 1. Isso deixa: my_db
postgres
template0
template1
grep -w
corresponde a palavras inteiras e, portanto, não corresponderá se você estiver procurando por temp
Neste cenário. O -q
A opção suprime qualquer saída gravada na tela, portanto, se você quiser executar isso interativamente em um prompt de comando, poderá excluir o -q
para que algo seja exibido imediatamente. Observe que
grep -w
corresponde a alfanuméricos, dígitos e sublinhado, que é exatamente o conjunto de caracteres permitidos em nomes de banco de dados sem aspas no postgresql (hífens não são válidos em identificadores sem aspas). Se você estiver usando outros caracteres, grep -w
não vai funcionar para você. O status de saída de todo esse pipeline será
0
(sucesso) se o banco de dados existir ou 1
(falha) se isso não acontecer. Seu shell irá definir a variável especial $?
para o status de saída do último comando. Você também pode testar o status diretamente em uma condicional:if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
# database exists
# $? is 0
else
# ruh-roh
# $? is 1
fi