ファイルをループしてbashスクリプト変数を取得する

ファイルをループしてbashスクリプト変数を取得する

私は、各サーバーにログインしてログインが成功したかどうかを記録することで、複数のリモート 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=,、処理の他の部分も簡素化できる可能性があります。

関連情報