Utilizo la siguiente modificación de la solución de Arturo:
psql -lqt | cut -d \| -f 1 | grep -qw <db_name>
Que hace
psql -l produce algo como lo siguiente:
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 el enfoque ingenuo significa que la búsqueda de una base de datos llamada "Lista", "Acceso" o "filas" tendrá éxito. Por lo tanto, canalizamos esta salida a través de un conjunto de herramientas de línea de comando integradas para buscar solo en la primera columna.
La -tbandera elimina encabezados y pies de página:
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
El siguiente bit, cut -d \| -f 1divide la salida por el |carácter de tubería vertical (escapado del shell con una barra invertida), y selecciona el campo 1. Esto deja:
my_db
postgres
template0
template1
grep -wcoincide con palabras completas, por lo que no coincidirá si está buscando tempen este escenario. La -qopción suprime cualquier salida escrita en la pantalla, por lo que si desea ejecutar esto interactivamente en un símbolo del sistema, puede excluirlo -qpara que algo se muestre de inmediato.
Tenga en cuenta que grep -wcoincide con los caracteres alfanuméricos, los dígitos y el guión bajo, que es exactamente el conjunto de caracteres permitidos en los nombres de bases de datos sin comillas en postgresql (los guiones no son legales en los identificadores sin comillas). Si está utilizando otros personajes, grep -wno funcionará para usted.
El estado de salida de toda esta tubería será 0(exitoso) si la base de datos existe o 1(falla) si no existe. Su shell establecerá la variable especial $?en el estado de salida del último comando. También puede probar el estado directamente en un condicional:
if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
# database exists
# $? is 0
else
# ruh-roh
# $? is 1
fi
... | grep 0para hacer que el valor de retorno del shell sea 0 si la base de datos no existe y 1 si existe; o... | grep 1por el comportamiento opuesto