![循环遍历文件获取bash脚本变量](https://linux22.com/image/110499/%E5%BE%AA%E7%8E%AF%E9%81%8D%E5%8E%86%E6%96%87%E4%BB%B6%E8%8E%B7%E5%8F%96bash%E8%84%9A%E6%9C%AC%E5%8F%98%E9%87%8F.png)
我正在编写一个脚本,通过登录每台服务器并记录登录是否成功来检查多个远程 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=,
并且也许还可以简化处理的其他一些部分。