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