
私は、各サーバーにログインしてログインが成功したかどうかを記録することで、複数のリモート MYSQL ホストのステータスを確認するスクリプトを作成中です。アイデアとしては、MYSQL ホストのログイン詳細を CSV ファイルに保存し、スクリプトでこのファイルをループしてログインし、ログインが成功したかどうかを記録するというものです。
CSV ファイルに保存される MYSQL ログイン データは次のようになります。
$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=,
、処理の他の部分も簡素化できる可能性があります。