循環遍歷檔案取得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

您可以使用內建函數並告訴它應該使用(輸入欄位分隔符號)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=,也許還可以簡化處理的其他一些部分。

相關內容