一、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 数据库主从复制正常!