Recorra el archivo para obtener la variable del script bash

Recorra el archivo para obtener la variable del script bash

Estoy trabajando en un script para verificar el estado de varios hosts MYSQL remotos iniciando sesión en cada servidor y registrando si el inicio de sesión fue exitoso o no. La idea es almacenar los detalles de inicio de sesión para los hosts MYSQL en un archivo CSV y hacer que el script recorra este archivo, inicie sesión y registre si el inicio de sesión se realizó correctamente.

Los datos de inicio de sesión MYSQL almacenados en el archivo CSV serían los siguientes:

$host,$user,$password

Siendo un novato en scripting bash, tengo problemas para entender cómo es mejor abordar la parte donde el script recorre un CSV para obtener detalles de MYSQL. ¿Alguien puede ayudar?

Actualmente probé lo siguiente para hosts MYSQL individuales

mysql -h$host -=$user -p$pass -d$db -e exit
if [ "$?" -eq "0" ]
then
        echo "Connection established"
else
        echo "Connection not established"
fi

Gracias de antemano.

Respuesta1

Puede usar el readincorporado y decirle que debe dividir la línea en comas usando la IFSvariable de shell (separador de campo de entrada):

$ cat file 
user1,host1,pass1
user2,host2,pass2

$ while IFS="," read -r user host pass; do echo "$user:$host:$pass"; done < file 
user1:host1:pass1
user2:host2:pass2

Entonces, en tu script, querrás algo como:

while IFS="," read -r user host pass; do 
    if mysql -h "$host" -u "$user" -p"$pass" -e exit; then 
        echo "Connection established"
    else 
        echo "Connection failed" fi; 
done < file

Sin embargo, lo anterior no funcionará si alguna de sus contraseñas (u otras variables, pero supongo que solo las contraseñas pueden tener este problema) contiene una coma. Si eso puede ser un problema para usted, tendrá que cambiar el separador por otro en lugar de una coma. Algo que nunca aparecerá en una contraseña. Por ejemplo una pestaña, y luego puedes hacer:

while IFS=$'\t' read -r user host pass; do 
    if mysql -h "$host" -u "$user" -p"$pass" -e exit; then 
        echo "Connection established"
    else 
        echo "Connection failed" fi; 
done < file

Respuesta2

CSV no es particularmente conveniente, pero ahí va.

while IFS=, read host user pass; do
    if mysql -h"$host" -u"$user" -p"$pass" -d"$db" -e exit
    then
        echo "$host: Connection established"
    else
        echo "$host: Connection not established"
    fi
done <file.csv

Observe cómo if(y en general todas las declaraciones de control de flujo del shell) ya examina $?detrás de escena por usted, por lo que rara vez necesitará examinarlo explícitamente en sus scripts.

Además, agregué el nombre de host a los mensajes de salida para que sean más informativos.

Si puede tener instalado un archivo de entrada separado por espacios en blanco, puede eliminarlo IFS=,y tal vez también simplificar algunas otras partes de su procesamiento.

información relacionada