
我正在編寫一個腳本,透過登入每台伺服器並記錄登入是否成功來檢查多個遠端 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
您可以使用內建函數並告訴它應該使用(輸入欄位分隔符號)shell 變數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
請注意(通常是所有 shell 的流程控制語句)如何$?
在幕後為您進行檢查,因此您很少需要在腳本中明確檢查它。
另外,我將主機名稱添加到輸出訊息中,以使它們提供更多資訊。
如果您可以安裝一個以空格分隔的輸入文件,那麼您可以取出 ,IFS=,
也許還可以簡化處理的其他一些部分。