• 欢迎访问显哥博客,本网站纯属学习技术,绝无商业用途,欢迎小伙伴们共同学习!研究技术!QQ:52249909 加我QQ
  • 世界75亿人,这么小的概率,能认识你,是我一生的幸运,不妨加个QQ接触一下:52249909 加我QQ

Shell脚本编程学习——循环语句之while循环【显哥出品,必为精品】

Shell编程 lixian 2年前 (2020-04-28) 231次浏览 0个评论 扫描二维码
文章目录[隐藏]

一、while循环概述

Shell脚本编程学习——循环语句之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 
你不是超级管理员,请滚开! [  失败  ]

Shell脚本编程学习——循环语句之while循环【显哥出品,必为精品】

六、判断数据库主从复制脚本

1.主从复制环境准备

环境准备这里就不详细介绍步骤了,详情请看另一篇文章

https://www.lixian.fun/2591.html

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

本站博主 , 版权所有丨如未注明 , 均为原创
转载请注明原文链接:Shell脚本编程学习——循环语句之while循环【显哥出品,必为精品】
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到