循环遍历文件获取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=,并且也许还可以简化处理的其他一些部分。

相关内容