Faça um loop pelo arquivo para obter a variável do script bash

Faça um loop pelo arquivo para obter a variável do script bash

Estou trabalhando em um script para verificar o status de vários hosts MYSQL remotos, fazendo login em cada servidor e registrando se o login foi bem-sucedido ou não. A ideia é armazenar os detalhes de login dos hosts MYSQL em um arquivo CSV e fazer com que o script percorra esse arquivo, faça login e registre se o login foi bem-sucedido.

Os dados de login MYSQL armazenados no arquivo CSV seriam os seguintes:

$host,$user,$password

Sendo um novato em scripts bash, estou tendo problemas para entender como é melhor abordar a parte em que o script percorre um CSV para obter detalhes do MYSQL. Alguém pode ajudar?

Atualmente testei o seguinte para hosts MYSQL individuais

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

Desde já, obrigado.

Responder1

Você pode usar o readbuiltin e dizer que ele deve dividir a linha entre vírgulas usando a IFSvariável 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

Então, no seu script, você gostaria de 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

O texto acima, no entanto, será quebrado se alguma de suas senhas (ou outras variáveis, mas presumo que apenas as senhas possam ter esse problema) contiver uma vírgula. Se isso for um problema para você, você terá que alterar o separador para outra coisa em vez de uma vírgula. Algo que nunca aparecerá em uma senha. Por exemplo, uma guia, e então você pode fazer:

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

Responder2

CSV não é particularmente conveniente, mas aqui vai.

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 como if(e geralmente todas as instruções de controle de fluxo do shell) já examinam $?os bastidores para você, portanto, muito raramente você precisará examiná-lo explicitamente em seus scripts.

Além disso, adicionei o nome do host às mensagens de saída, para torná-las mais informativas.

Se você puder instalar um arquivo de entrada separado por espaços em branco, poderá retirá-lo IFS=,e talvez também simplificar algumas outras partes do seu processamento.

informação relacionada