一、while循环概述

while循环只有条件成立,则就会反复执行循环体里面的命令,直到条件为假时,才会结束
无限的循环下去,死循环。
1.格式
while 条件测试 do 循环体 done
while的三种循环写法
while true do 循环体 done while read line do 循环体 done < file.txt while [ 条件判断 ] do 循环体 done
二、while循环两数相乘表示例
1.脚本代码
[root@xian /server/scripts]# cat while-ab.sh
#!/bin/bash
# File Name: while-ab.sh
# Author: lixian
#######################
a=0
b=9
while [ $a -le 9 ]
do
echo "$a x $b = $(($a*$b))"
let a++
let b--
done
2.执行结果
[root@xian /server/scripts]# sh while-ab.sh 0 x 9 = 0 1 x 8 = 8 2 x 7 = 14 3 x 6 = 18 4 x 5 = 20 5 x 4 = 20 6 x 3 = 18 7 x 2 = 14 8 x 1 = 8 9 x 0 = 0
三、创建不同日期的文件
1.脚本代码
[root@xian /server/scripts/while_mkdir-time-file]# cat while-1.sh
#!/bin/bash
# File Name: while-1.sh
# Author: lixian
#######################
num=9
while [ $num -gt 1 ]
do
Date=$(date +%F)
touch ${Date}.txt
date -s "+1 day" +%F &>/dev/null
echo "创建${Date}.txt 成功"
num=$[$num-1]
done
ntpdate ntp.aliyun.com &>/dev/null
2.执行结果
[root@xian /server/scripts/while_mkdir-time-file]# sh while-1.sh 创建2020-04-28.txt 成功 创建2020-04-29.txt 成功 创建2020-04-30.txt 成功 创建2020-05-01.txt 成功 创建2020-05-02.txt 成功 创建2020-05-03.txt 成功 创建2020-05-04.txt 成功 创建2020-05-05.txt 成功 [root@xian /server/scripts/while_mkdir-time-file]# ls -l total 4 -rw-r--r-- 1 root root 0 Apr 28 20:56 2020-04-28.txt -rw-r--r-- 1 root root 0 Apr 29 2020 2020-04-29.txt -rw-r--r-- 1 root root 0 Apr 30 2020 2020-04-30.txt -rw-r--r-- 1 root root 0 May 1 2020 2020-05-01.txt -rw-r--r-- 1 root root 0 May 2 2020 2020-05-02.txt -rw-r--r-- 1 root root 0 May 3 2020 2020-05-03.txt -rw-r--r-- 1 root root 0 May 4 2020 2020-05-04.txt -rw-r--r-- 1 root root 0 May 5 2020 2020-05-05.txt
四、通过读入文件进行创建用户
1.业务需求
1. 设置一个随机24位的密码 需要将用户和密码保存到一个文件中,密码文件只有管理员拥有可读权限,其他人没有权限
2. 此脚本只有管理员root才能执行
2.脚本代码
[root@xian /server/scripts]# cat useradd_sj_passwd.sh
#!/bin/bash
# File Name: useradd_sj_passwd.sh
# Author: lixian
#######################
#调用函数库
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
#判断用户是否为超级管理员
if [ ! $USER == "root" -o ! $UID -eq 0 ];then
action "你不是管理员,请滚开!" /bin/false
exit
fi
#while语句循环
while read line
do
#判断用户是否存在系统中
id $User &>/dev/null
if [ $? -ne 0 ];then
action "${line}用户已存在!不能重复创建!" /bin/false
else
Pass=$(mkpasswd -l 12 -c 3 -C 3 -d 3 -s 3)
useradd ${line} &>/dev/null && echo $Pass |passwd --stdin $line &>/dev/null
if [ $? -eq 0 ];then
action "${line}用户创建成功!用户密码存放在pass.txt中!" /bin/true
echo "${line}:${Pass}" >>pass.txt
else
action "用户创建失败!" /bin/false
fi
fi
done<user.txt
chmod 400 pass.txt &>/dev/null
3.执行结果
[root@xian /server/scripts]# cat user.txt
lx1
lx2
lx3
lx4
lx5
[root@xian /server/scripts]# sh useradd_sj_passwd.sh
lx1用户创建成功!用户密码存放在pass.txt中! [ 成功 ]
lx2用户创建成功!用户密码存放在pass.txt中! [ 成功 ]
lx3用户创建成功!用户密码存放在pass.txt中! [ 成功 ]
lx4用户创建成功!用户密码存放在pass.txt中! [ 成功 ]
lx5用户创建成功!用户密码存放在pass.txt中! [ 成功 ]
[root@xian /server/scripts]# cat pass.txt
lx1:7aUCC8c<4f].
lx2:.X7a3=Nfh[M6
lx3:2rf%O2MN.f3%
lx4:3kA05R(jl?E{
lx5:)0YQ5fn[F(9n
五、根据用户输入批量创建用户
1.业务需求
1. 提示用户输入创建用户的前缀 前缀必须是有字母组成
2. 提示用户输入创建用户的数量 必须为数字组成
3. 询问用户是否创建这些用户 显示用户列表
4. 只有root超级管理员才有权限执行该脚本
5. 设置24位随机密码 需要将用户和密码保存到一个文件中,密码文件只有管理员拥有可读权限,其他人没有权限
2.脚本代码
[root@xian /server/scripts]# cat while_useradd_Qz_Num.sh
#!/bin/bash
# File Name: while_useradd_Qz_Num.sh
# Author: lixian
#######################
#调用函数库
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
if [ ! $USER == "root" -o ! $UID -eq 0 ];then
action "你不是超级管理员,请滚开!" /bin/false
exit
fi
#提示用户输入创建用户的前缀
read -p "请输入你需要创建的用户(必须是字母):" Qz
#判断用户输入前缀的是否是字母
if [[ ! $Qz =~ ^[a-Z]+$ ]];then
action "你输入的前缀不是字母,请重新输入!" /bin/false
exit
fi
#提示用户输入创建用户的数量
read -p "输入你创建用户的数量:" Num
#判断用户输入的是否是数字
if [[ ! $Num =~ ^[0-9]+$ ]];then
action "你输入的数量不规范!请重新输入!" /bin/false
exit
fi
read -p "你是否要创建${Qz}1..${Qz}${Num},[yes|no]:" Confirm
case $Confirm in
Yes|yes|y)
a=1
while [ $a -le $Num ]
do
#判断用户是否存在
User=${Qz}${a}
id $User &>/dev/null
if [ $? -eq 0 ];then
action "${User}用户已存在!不能重复创建" /bin/false
else
Pass=$(mkpasswd -l 12 -c 3 -C 3 -d 3 -s 3)
useradd $User &>/dev/null && echo "$Pass" |passwd --stdin $User &>/dev/null
if [ $? -eq 0 ];then
action "成功创建${User}用户,密码存放在passwd.txt中!" /bin/true
echo -e "User:${User}\t Pass:${Pass}" >>passwd.txt
chmod 400 passwd.txt
else
action "用户创建$User失败!"
fi
fi
let a++
done
;;
No|no|n)
action "你选择了不创建用户!" /bin/false
exit
;;
*)
action "你输入的不正确!" /bin/false
exit
esac
3.执行结果
[lx1@xian /server/scripts]$ sh while_useradd_Qz_Num.sh 你不是超级管理员,请滚开! [ 失败 ]
六、判断数据库主从复制脚本
1.主从复制环境准备
环境准备这里就不详细介绍步骤了,详情请看另一篇文章
2.从库脚本检测
[root@web01 ~]# cat mysql_master_slave.sh
#!/bin/bash
# File Name: mysql_master_slave.sh
# Author: lixian
####################
Db_User=root
Db_Pass=123456
IO_Status=$(mysql -uroot -p123456 -e "show slave status\G" |awk '/Slave_IO_Running/{print $NF}')
SQL_Status=$(mysql -uroot -p123456 -e "show slave status\G" |awk '/Slave_SQL_Running/{print $NF}')
if [ $IO_Status == "Yes" -a $SQL_Status == "Yes" ];then
echo "数据库主从复制正常!"
else
if [ $IO_Status == "Yes" ];then
echo "数据库主从复制IO线程正常!"
else
echo "数据库主从复制IO线程异常!"
mysql -uroot -p123456 -e "show slave status\G" |grep "Last_IO" >/tmp/io_err.log
mail -s "数据库主从复制IO线程异常!" lixian@qq.com < /tmp/io_err.log
if [ $? -eq 0 ];then
echo "邮件已发送给管理员!"
else
echo "邮件发送失败!"
fi
fi
if [ $SQL_Status == "Yes" ];then
echo "主从复制SQL线程正常!"
else
echo "主从复制SQL线程异常!"
SQL_Err=$(mysql -uroot -p123456 -e "show slave status\G" |awk '/Last_SQL_Errno/{print $NF}')
case $SQL_Err in
1007|1062|1058|1059|1008)
echo "SQL线程出错为从库写入!脚本尝试跳过这次错误!"
mysql -uroot -p123456 -e "stop slave;set global sql_slave_skip_counter=1;start slave;"
SQL_Status=$(mysql -uroot -p123456 -e "show slave status\G" |awk '/Slave_SQL_Running/{print $NF}')
if [ $SQL_Status == "Yes" ];then
echo "脚本已经成功的执行一次跳过!主从复制正常!"
echo "脚本已经成功的执行一次跳过!主从复制正常!" | mail -s "主从复制SQL线程报错!尝试跳过一次成功!" lixian656@qq.com
else
echo "脚本尝试跳过一次错误!但是主从复制还是异常!"
mysql -uroot -p123456 -e "show slave status\G" |grep "Last_SQL" >/tmp/sql_err.log
mail -s "数据库主从出现SQL错误,已解决!" lixian656@qq.com < /tmp/sql_err.log
if [ $? -eq 0 ];then
echo "邮件已发送给管理员!"
else
echo "邮件发送失败!"
fi
fi
;;
*)
echo "SQL线程出错!"
mysql -uroot -p123456 -e "show slave status\G" |grep "Last_SQL" >/tmp/sql_err.log
mail -s "数据库主从复制SQL线程报错" lixian656@qq.com < /tmp/sql_err.log
if [ $? -eq 0 ];then
echo "数据库主从复制SQL线程报错邮件发送成功!"
else
echo "邮件发送失败!"
fi
esac
fi
fi
3.检测结果
正常主从复制从库:
[root@db02 ~]# sh mysql_master_slave.sh
数据库主从复制正常!
[root@db02 ~]# mysql -uroot -p123456
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 44
Server version: 5.5.64-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.51
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 245
Relay_Log_File: mariadb-relay-bin.000004
Relay_Log_Pos: 529
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
主库停止数据库:
[root@db01 ~]# systemctl stop mariadb.service
从库执行脚本:
[root@db02 ~]# sh mysql_master_slave.sh 数据库主从复制IO线程异常! 邮件已发送给管理员! 主从复制SQL线程正常!
主库开启数据库:
[root@db01 ~]# systemctl start mariadb.service
从库执行脚本:
[root@db02 ~]# sh mysql_master_slave.sh 数据库主从复制正常!


