Puede hacer que sus scripts bash se ejecuten de manera distinto según el contenido de una base de datos MySQL conectándose a ella desde la línea de comando y pasando una consulta, que puede utilizar en if
bloques para bifurcar en función de un valor.
Nota: Nuestros ejemplos muestran el uso del usuario root en MySQL, pero le gustaría sustituir una cuenta de usuario distinto allí.
Ejecutar consultas SQL desde un script Bash
La sintaxis para ejecutar dentro de un script bash es la misma que para entrar a una base de datos desde la línea de comandos:
mysql -u root -pPassword -h hostname -D dbname -e 'query'
Si su base de datos se ejecuta localmente, puede omitir el -h
bandera. Si está ejecutando una base de datos de desarrollo, puede omitir el -p
marque si su base de datos no tiene contraseña.
Esto generará los resultados de la consulta en STDOUT, que puede canalizar a un archivo:
mysql -u root -D dbname -e 'SELECT * FROM table' > file
… o almacenar en una variable con el $( )
construir:
variable=$(mysql -u root -D dbname -e 'SELECT * FROM table')
Pero, la salida no será muy bonita de forma predeterminada, por lo que puede facilitar el trabajo usando el -B
para imprimir en formato de valores separados por tabuladores (TSV) y la -N
marca para omitir los encabezados de columna.
Los archivos TSV son los primos menos utilizados de los archivos CSV, que puede convertir desde la línea de comandos.
Comprobación de un valor específico y ramificación
Si desea realizar una bifurcación en función de un valor en su base de datos, puede consultar la fila y columna específicas y almacenar la solución en una variable. A continuación, puede usar un intento if
cuadra para ramificarse en función del contenido de esa variable.
field=$(mysql -u root -BNe 'USE test; SELECT label FROM test WHERE id=1') if [ $field == 'TEST' ]; then //do stuff fi
Esto solo funciona cuando solicita un valor específico y realiza una comparación simple. Si necesita más manipulación de la que proporciona bash, puede utilizar awk
, que puede elegir columnas individuales del texto y realizar comparaciones:
if [ $(echo $field | awk '{if ($1 == value && $2 == value2) print 1; else print 0}') == "1" ]; then //do stuff fi
Aquí el awk
El comando imprime verdadero o falso (1 o 0), que el bash if
puede usar para comparar y bifurcar.
Ambos ejemplos asumen que su consulta SQL solo devuelve una sola fila, lo que puede garantizar seleccionando según el ID. Pero si está ejecutando una consulta más compleja, es factible que desee limitar la solución a la primera fila con el comando SQL LIMIT 1
.
RELACIONADO: Cómo exportar un archivo CSV desde la línea de comandos de MySQL
Verificación de errores: verificar si existe una base de datos o una tabla
Aunque es probable que esté escribiendo este script específicamente para su servidor, un poco de verificación de errores nunca perjudica a nadie. Querrá verificar que la base de datos y las tablas con las que trabajará verdaderamente existen antes de comenzar a trabajar con ellas. Al mismo tiempo, si la conexión a la base de datos no funciona, además se producirá un error aquí.
El comando SQL 'USE dbname'
producirá un error si dbname
no existe (código de retorno> 0). Puede utilizar esto en un if
block para chequear si la base de datos está configurada correctamente:
if mysql -u root -e 'USE mydbname'; then //database exists, do stuff fi
Puede invertir el if
bloque comenzando el booleano con un !
, que ejecutará el código solo cuando la base de datos no esté configurada, lo cual es útil para realizar la configuración por primera vez.
De la misma forma, puede verificar si existen tablas al intentar entrar a la primera fila:
if mysql -u root -e 'USE mydbname; SELECT * FROM tablename LIMIT 1'; then //database and table exist, do more stuff fi
Debido a que el if
block comprueba el código de retorno de cualquier comando que coloque en él, y los comandos de MySQL devolverán un código de error si disponen problemas, puede utilizar cualquier comando en un if
bloquear para prestar atención los errores.