Пройтись по файлу, чтобы получить переменную скрипта bash

Пройтись по файлу, чтобы получить переменную скрипта bash

Я работаю над скриптом для проверки статуса нескольких удаленных хостов MYSQL, входя в каждый сервер и записывая, был ли вход успешным или нет. Идея состоит в том, чтобы сохранить данные входа для хостов MYSQL в файле CSV и заставить скрипт циклически проходить по этому файлу, входить и записывать, был ли вход успешным.

Данные входа в MYSQL, сохраненные в CSV-файле, будут следующими:

$host,$user,$password

Будучи новичком в написании скриптов bash, я не могу понять, как лучше всего подойти к той части, где скрипт проходит по CSV для получения данных MYSQL. Может ли кто-нибудь помочь?

В настоящее время я протестировал следующее для отдельных хостов MYSQL

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

Заранее спасибо.

решение1

Вы можете использовать readвстроенную функцию и указать ей, что она должна разбить строку запятыми, используя 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

Итак, в вашем сценарии вы хотели бы что-то вроде:

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

Однако вышесказанное не сработает, если любой из ваших паролей (или других переменных, но я предполагаю, что только пароли могут иметь эту проблему) будет содержать запятую. Если это может быть проблемой для вас, вам придется изменить разделитель на что-то другое вместо запятой. Что-то, что никогда не будет встречаться в пароле. Например, табуляция, и тогда вы можете сделать:

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

решение2

CSV не очень удобен, но пусть будет.

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

Обратите внимание, что if(и вообще все операторы управления потоком командной оболочки) уже проверяются $?за кулисами, поэтому вам очень редко придется явно проверять их в своих скриптах.

Кроме того, я добавил имя хоста в выходные сообщения, чтобы сделать их более информативными.

Если вместо этого у вас есть входной файл, разделенный пробелами, вы можете убрать IFS=,и, возможно, также упростить некоторые другие части вашей обработки.

Связанный контент