Перебрать файл, чтобы получить переменную сценария 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

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

0
28.04.2017, 17:47
2 ответа

CSV не особо удобно, но вот идет.

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

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

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

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

0
28.01.2020, 04:46

Вы можете использовать встроенную функцию 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
0
28.01.2020, 04:46

Теги

Похожие вопросы