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 -t
bandera 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 1
divide 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 -w
coincide con palabras completas, por lo que no coincidirá si está buscando temp
en este escenario. La -q
opción suprime cualquier salida escrita en la pantalla, por lo que si desea ejecutar esto interactivamente en un símbolo del sistema, puede excluirlo -q
para que algo se muestre de inmediato.
Tenga en cuenta que grep -w
coincide 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 -w
no 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 0
para hacer que el valor de retorno del shell sea 0 si la base de datos no existe y 1 si existe; o... | grep 1
por el comportamiento opuesto