Durchlaufen Sie die Datei, um die Bash-Skriptvariable zu erhalten.

Durchlaufen Sie die Datei, um die Bash-Skriptvariable zu erhalten.

Ich arbeite an einem Skript, um den Status mehrerer Remote-MySQL-Hosts zu überprüfen, indem ich mich bei jedem Server anmelde und aufzeichne, ob die Anmeldung erfolgreich war oder nicht. Die Idee besteht darin, die Anmeldedaten für die MySQL-Hosts in einer CSV-Datei zu speichern und das Skript diese Datei durchlaufen zu lassen, sich anzumelden und aufzuzeichnen, ob die Anmeldung erfolgreich war.

Die in der CSV-Datei gespeicherten MySQL-Anmeldedaten wären folgende:

$host,$user,$password

Da ich ein Neuling im Bash-Scripting bin, verstehe ich nicht so recht, wie ich den Teil am besten angehe, in dem das Skript eine CSV-Datei durchläuft, um MySQL-Details abzurufen. Kann mir jemand helfen?

Derzeit habe ich Folgendes für einzelne MySQL-Hosts getestet

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

Dank im Voraus.

Antwort1

Sie können das integrierte Feature verwenden und ihm mithilfe der Shell-Variable (Eingabefeldtrennzeichen) readmitteilen, dass die Zeile an Kommas getrennt werden soll :IFS

$ 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

Sie möchten also in Ihrem Skript etwas wie:

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

Das oben genannte funktioniert jedoch nicht, wenn eines Ihrer Passwörter (oder andere Variablen, aber ich nehme an, dass nur die Passwörter dieses Problem haben könnten) ein Komma enthält. Wenn das für Sie ein Problem sein kann, müssen Sie das Trennzeichen durch etwas anderes anstelle eines Kommas ersetzen. Etwas, das niemals in einem Passwort vorkommen wird. Zum Beispiel ein Tabulatorzeichen, und dann können Sie Folgendes tun:

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

Antwort2

CSV ist nicht besonders praktisch, aber hier ist es.

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

Beachten Sie, wie if(und im Allgemeinen alle Flusssteuerungsanweisungen der Shell) dies bereits $?im Hintergrund für Sie prüft, sodass Sie es in Ihren Skripten nur sehr selten explizit prüfen müssen.

Außerdem habe ich den Hostnamen zu den Ausgabenachrichten hinzugefügt, um sie informativer zu gestalten.

Wenn Sie stattdessen eine durch Leerzeichen getrennte Eingabedatei haben können, können Sie das herausnehmen IFS=,und möglicherweise auch einige andere Teile Ihrer Verarbeitung vereinfachen.

verwandte Informationen