Shell脚本(三)


一、if介绍

如何写一个高可用性的脚本,赋予脚本智能化,赋予脚本执行逻辑。

比如nginx安装脚本中

  • configure执行成功在执行make,
  • make执行成功在执行make install
  • 上一步错误就不需要执行后面的代码了。

answer: 加入判断

只要你想在代码中判断一下的时候就第一时间想到if就行了,适用于99%的语言。

当我们在写程序的时候,时常对上一步执行是否成功如何判断苦恼,当我们今天学习了if就可以解决你的苦恼。if语句在我们程序中就是用来做判断的,以后大家不管学习什么语言,以后只要涉及到判断的部分,大家就可以直接拿if来使用,不同的语言之间的if只是语法不同,原理是相同的。

二、单if语法

适用范围:只需要一步判断,条件返回真干什么。

语句格式

if [ condition ]           #condition 值为true or false
   then                    #条件为真的时候执行
      commands             #代码块 一行或者多行代码
fi             #语句的结束

流程判断11.png

该语句翻译成汉语大意如下:

假如  条件为真
 那么
    执行commands代码块
结束

通过一段代码来演示一下吧,判断 当前用户是不是root,如果不是那么返回”ERROR: need to be root so that!“

#!/bin/bash
#Author: www.zuolaoshi.cn
#Created Time: 
#Script Description: 

if [ $USER != 'root' ]
   then
    echo "ERROR: need to be root so that"
    exit 1
fi

三、if…else语句

适用范围==:两步判断,条件为真干什么,条件为假干什么。

if [ condition ]     
     then               条件为真
          commands1           要执行代码块
else                    条件为假
          commands2            要执行的代码块
fi              结束

流程判断2.png

该语句翻译成汉语大意如下:

假如条件为真
  那么

        执行commands1代码块
否则
        执行commands2代码块
结束

通过一段代码演示一下吧,判断当前登录用户是管理员还是普通用户,如果是管理员输出”hey admin“ 如果是普通用户输出”hey guest“

#!/bin/bash
#Author:www.zuolaoshi.cn
#Created Time:
#Script Description: 

if [ $USER == 'root' ]
   then
    echo "hey admin"
else
    echo "hey guest"
fi

四、if…elif…else

适用范围:多于两个以上的判断结果,也就是多于一个以上的判断条件。

if [ condition 1]     满足第一个条件

     then                      command1    执行command1代码块
elif [ condition 2]   满足第二个条件

     then                        commands2    执行command2代码块

  .......
else      如果条件都不满足

            commandsX      执行commandX代码块
fi    结束判断

流程判断3.png

该语句翻译成汉语大意如下:

假如 条件1 为真

      那么

             执行代码块1
假如 条件2 为真

      那么

            执行代码块2

      以此类推的N个条件及对应的执行代码块
否则 【以上所有条件中没有一个满足的】

           执行代码块X
结束

通过一段代码演示一下吧,通过一个脚本,判断两个整数的关系

案例需求 判断内存的使用率 60以下 ok 60以上 黄色警告 70以上 橙色严重警告 80以上 红色警告

案例思考

  • 内存使用率获得方式 – 手动给出 – 通过内存查看命令运算得出

案例代码

#!/bin/bash
#1、条件
#判断内存的使用率
#60以下    ok 绿色  32m
#60以上    黄色警告   33m
#70以上    粉色严重警告 35m 
#80以上    红色警告 31m

#2、算法
#收集内存使用率  $1 
#
#多条件判断

if [ $1 -gt 80 ]
then
    echo -e "\033[31m 警告 \033[0m"
elif [ $1 -gt 70 ]
then
    echo -e "\033[35m 警告 \033[0m"
elif [ $1 -gt 60 ]
then
    echo -e "\033[33m 警告 \033[0m"
else
    echo -e "\033[32m OK \033[0m"
fi


#注意事项
#多条件判断  需要从最严格开始判断  否者 后面的就不会生效
#如果你第一个判断的是60以上,那么 70 80 都符合第一个条件。所以后面的判断70  80 就没有任何意义

五、练习案例

案例需求 比较两个整数的关系

案例思考

  • 两个整数有几种关系 – 大于 – 等于 – 小于

案例代码

#!/bin/bash
#Author: www.zuolaoshi.cn
#Created Time:
#Script Description: 

if [ $1 -gt $2 ]
   then
    echo "$1 > $2"
elif [ $1 -eq $2 ]
   then
        echo "$1 = $2"
else
        echo "$1 < $2"
fi

六、if嵌套if

当有多步判断的时候,可以使用if嵌套

1、多步判断 类似于多条件if 2、依赖执行的环境 configure->make->make install

6.1、使用if嵌套if的方式判断两个整数的关系

#!/bin/bash
#Author: 
#Created Time: 
#Script Description: 

if [ $1 -ne $2 ]
   then
       if [ $1 -gt $2 ]
      then
        echo " $1 > $2 "
       else
        echo " $1 < $2 "
       fi
else
       echo " $1 = $2 "
fi

6.2、写一个nginx安装初始化脚本

案例需求 写一个nginx业务初始化脚本,完成nginx软件自动安装。

案例思考

  • 1、nginx软件包获得方式
  • 2、nginx安装流程
  • 3、nginx安装依赖关系

案例步骤

  • 1、软件包下载
  • 2、软件包解压
  • 3、安装依赖包
  • 4、安装nginx
  • 5、返回结果

案例代码

#!/bin/bash
#Author: www.zuolaoshi.cn
#Created Time: 
#Script Description: nginx aoto install script


source_pkg=nginx-1.19.2.tar.gz
#1、软件包下载
wget http://nginx.org/download/$source_pkg 
#2、解压
if [ -f $source_pkg ];then
    tar xf $source_pkg && cd nginx-1.19.2
else
        echo "not found $source_pkg"
    exit 1
fi

#3、安装依赖包
if ! ( yum -y install pcre-devel zlib-devel );then
      echo "yum: install soft error"
      exit 1
fi

#4、配置
#判断配置语句执行结果
if ./configure 1>/dev/null        
    then
    #判断make执行结果
         if make 1>/dev/null
         then
         #判断make install安装结果
            if make install 1>/dev/null
               then
                echo "nginx 安装成功"
            else
                echo "nginx 安装失败"
                exit 1
                fi
        else
            echo "make fail"
            exit 1
        fi
else
        echo "configure fail"
        exit 1
fi



#./configure
#if [ $? -eq 0 ];then

#注意: 1>/dev/null
1  标准输出
2  标准错误输出

七、if高级用法

7.1、条件符号使用双圆括号,可以在条件中植入数学表达式 if (())

#!/bin/bash
#Author:
#Created Time:
#Script Description: 

if (( (5+5-5)*5/5 > 10 ))
    then
        echo "yes"
else
        echo "no"
fi

7.2、使用双方括号,可以在条件中使用通配符

通过代码看下 ,为字符串提供高级功能,模式匹配 r* 匹配r开头的字符串

#!/bin/bash
#Author: 
#Created Time: 
#Script Description: 
for var in  ab ac rx bx rvv vt
   do
       if [[ "$var" == r* ]]
      then
        echo "$var"
       fi
done

八、简写if

省去了关键字,条件为真采用&&符号链接命令块,条件为假采用||链接命令块

简写if一般用在简单的判断中

if [ ! -d /tmp/baism ]
    then
        mkdir /tmp/baism
fi

可以简写为

[  -d /tmp/baism ] && mkdir /tmp/baism

if [ $USER == 'root' ]
      then
          echo "hello root"
else
              echo "hello guest"
fi

可以简写
[ $USER == 'root' ]&&echo "hello root" || echo "hello guest"

九、课后练习

1计算机状态监控能ping通就算up不通为down,需要考虑网络延迟问题造成的假报警问题
#1分别ping  取三个值  判断三个值的结果
    1.1 ping 3 并取值
    1.2 三次结果与运算  得出结论


2监控一个服务端口,判断其状态

3打印内存使用率脚本打印内存使用率swap使用率buff&cache使用量

4打印磁盘使用率脚本对本机的磁盘使用率统计并打印结果
     使用率小于80绿色输出
     使用率小于90大于80黄色输出
     使用率小于95大于90红色输出

5网卡发送和就收数据量监控按秒统计

6URL监控脚本对某个URL进行监控返回值为200则代表成功访问

7写一个mysql binlog备份脚本要求每天0点0分计算机自动备份前一天的binlog日志打包后发送给备份服务器

8闰年判断

9判断/tmp/run目录是否存在如果不存在就建立如果存在就删除目录里所有文件

10写一个nginx安装脚本

工作中总是有很多工作需要重复性来完成,比如每天都需要执行一次备份、每天都需要分析一次业务的access.log日志,每分钟都需要监测一次主机的状态等等工作,这些重复性的工作我们一般都是使用脚本来完成,对于不需要频繁执行的任务,可以结合计划任务➕脚本完成,但是系统的计划任务只能精确到分,不能满足更频繁的重复工作。

这个时候我们除了依赖计划任务之外还有很多选择,比如脚本中的循环语句。

循环的优点

  • 1)节省内存 10M脚本 1M脚本 哪个更剩内存 完成同一个任务
  • 2)结构更清晰
  • 3)节省开发时间成本

一、if高级用法

1.1、条件符号使用双圆括号,可以在条件中植入数学表达式 if (())

#!/bin/bash
#Author: www.zuolaoshi.cn
#Created Time:
#Script Description: 

if (( (5+5-5)*5/5 > 10 ))
    then
        echo "yes"
else
        echo "no"
fi

1.2、使用双方括号,可以在条件中使用通配符

通过代码看下 ,为字符串提供高级功能,模式匹配 r* 匹配r开头的字符串

#!/bin/bash
#Author: www.zuolaoshi.cn
#Created Time: 
#Script Description: 
for var in  ab ac rx bx rvv vt
   do
       if [[ "$var" == r* ]]
      then
        echo "$var"
       fi
done

二、简写if

省去了关键字,条件为真采用&&符号链接命令块,条件为假采用||链接命令块

简写if一般用在简单的判断中

if [ ! -d /tmp/baism ]
    then
        mkdir /tmp/baism
fi

可以简写为

[  -d /tmp/baism ] && mkdir /tmp/baism

if [ $USER == 'root' ]
      then
          echo "hello root"
else
              echo "hello guest"
fi

可以简写
[ $USER == 'root' ]&&echo "hello root" || echo "hello guest"

一、条件循环语句-case

在生产环境中,我们总会遇到一个问题需要根据不同的状况来执行不同的预案,那么我们要处理这样的问题就要首先根据可能出现的情况写出对应预案,根据出现的情况来加载不同的预案。

1.1、case介绍

特点:根据给予的不同条件执行不同的代码块

比如你去相亲:你会在脑子里出现以下的预案:
第一眼看到对方父亲,你应该说:伯父好
第一眼看到对方母亲,你应该说:伯母好
第一眼看到对方奶奶,你应该说:奶奶好
。。。。


而这个例子中触发就是你第一眼看到了对方的谁,预案则是叫什么称呼。

再来说一个计算机的相关例子---监控内存使用率
内存使用率低于80%,脚本输出: 绿色字体的Memory use xx%
内存使用率大于80%小于90%,脚本输出: 黄色字体的Memory use xx%
内存使用大于90%,脚本输出: 红色字体的Memory use xx%

1.2、case语法

case $var in             定义变量;var代表是变量名
pattern 1)              模式1; | 分割多个模式,相当于or
    command1            需要执行的语句
    ;;                  两个分号代表命令结束
pattern 2)
    command2
    ;;
pattern 3)
    command3
    ;;
          *)              default,不满足以上模式,默认执行*)下面的语句
    command4
    ;;
esac                            esac表示case语句结束

二、案例

案例需求 写一个nginx启动管理脚本,可以实现/etc/init.d/nginx start|stop|restart|status|reload 或者 systemctl start nginx

#!/bin/bash
#Description: 
#Author: www.zuolaoshi.cn
#Created Time: 
#nginx service manage script

#variables
nginx_install_doc=/usr/local/nginx
proc=nginx
nginxd=$nginx_install_doc/sbin/nginx
pid_file=$nginx_install_doc/logs/nginx.pid

# Source function library.
if [ -f /etc/init.d/functions ];then
   . /etc/init.d/functions
else
   echo "not found file /etc/init.d/functions"
   exit
fi

#假如pid文件存在,那么统计一下nginx进程数量
if [ -f $pid_file ];then
   nginx_process_id=`cat $pid_file` 
   nginx_process_num=`ps aux |grep $nginx_process_id|grep -v "grep"|wc -l`
fi


#function
start () {
#如果nginx 没有启动直接启动,否则报错 已经启动
if [ -f $pid_file ]&&[ $nginx_process_num -ge 1 ];then
   echo "nginx running..."
else
   #如果pid文件存在,但是没有进程,说明上一次非法关闭了nginx,造成pid文件没有自动删除,所以启动nginx之前先删除旧的pid文件
   if [ -f $pid_file ] && [ $nginx_process_num -lt 1 ];then
        rm -f $pig_file
    #可以使用两个函数,两种方法来执行命令,并返回执行结果
        #1)daemon
        #2)action   建议这个,简单易用

    #echo " nginx start `daemon $nginxd` "
        action "nginx start" $nginxd
  fi
  #echo " nginx start `daemon $nginxd` "
  action "nginx start" $nginxd
fi

}

stop () {
#判断nginx启动的情况下才会执行关闭,如果没启动直接报错,或者提示用户服务没启动,这里我直接报错的原因是为了给大家演示失败的输出
if [ -f $pid_file ]&&[ $nginx_process_num -ge 1 ];then
     action "nginx stop" killall -s QUIT $proc
     rm -f $pid_file
else
     action "nginx stop" killall -s QUIT $proc 2>/dev/null
fi
}

restart () {
  stop
  sleep 1
  start
}

reload () {
#重载的目的是让主进程重新加载配置文件,但是前提是服务必须开启
#这里先判断服务是否开启,开启就执行加载,没有开启直接报加载错误
if [ -f $pid_file ]&&[ $nginx_process_num -ge 1 ];then
    action "nginx reload" killall -s HUP $proc
else
    action "nginx reload" killall -s HUP $proc 2>/dev/null
fi
}

status () {
if [ -f $pid_file ]&&[ $nginx_process_num -ge 1 ];then
 echo "nginx running..."
else
 echo "nginx stop"
fi 
}

#callable
case $1 in 
start) start;;
stop) stop;;
restart) restart;;
reload) reload;;
status) status;;
*) echo "USAGE: $0 start|stop|restart|reload|status";;
esac

一、循环语句-for

1.1、for介绍

脚本在执行任务的时候,总会遇到需要循环执行的时候,比如说我们需要脚本每隔五分钟执行一次ping的操作,除了计划任务,我们还可以使用脚本来完成,那么我们就用到了循环语句。

1.2、for基本语法 for条件循环

  • 列表for循环:用于将一组命令执行已知的次数,下面给出了for循环语句的基本格式:
for variable_name in {list}
     do
          command 
          command
          
     done
或者
for variable in a b c
     do
         command
         command
     done

1.3、for条件应用

for条件不同的赋值方式 a、赋值来自一个范围

for var in {1..10}
    do 
            echo $var
done

b、直接赋值

for var in 1 2 3 4 5
    do 
            echo $var
done

c、赋值来自命令

for var in `seq  10`
    do 
            echo $var
done

体验不同的方式

赋值来自一个范围
for var in $(seq 10)
    do 
            echo $var
done

for var in {0..10..2}
    do 
            echo $var
done


for var in {10..1}
    do 
            echo $var
done


for var in {10..1..-2}
    do 
            echo $var
done


for var in `seq 10 -2 1`
    do 
            echo $var
done
  • 不带列表循环

不带列表的for循环执行时由用户指定参数和参数的个数,下面给出了不带列表的for循环的基本格式:

for variable
    do
        command 
        command
        
   done

语法结构举例说明:

#!/bin/bash
for var
do
echo $var
done

echo "脚本后面有$#个参数"

1.4、for C格式语法

  • 类C风格的for循环
for(( expr1;expr2;expr3 ))
    do
        command
        command
            done
for (( i=1;i<=5;i++))  
    do
        echo $i
    done


expr1:定义变量并赋初值   变量初始值
expr2:决定是否进行循环(条件)  变量的条件
expr3:决定循环变量如何改变,决定循环什么时候退出 自增或自减运算



多变量用法
for ((A=1,B=10;A<10,B>1;A++,B--))

语法结构举例说明:

for ((i=1;i<=5;i++));do echo $i;done
for ((i=1;i<=10;i+=2));do echo $i;done
for ((i=2;i<=10;i+=2));do echo $i;done

二、练习案例

jobs: 写一个扫描软件,扫描本地网络中存活的机器

案例需求: 判断本地网络中哪些IP被使用

案例分析: 采用ping的方式判断IP是否被占用

 a、能ping通说明占用
 b、不能ping通说明未被占用

b、命令

ping -c1 IP

算法: 1、ping ip 2、分析ping结果 3、输出结果

#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time: 
#Release: 
#Description: 扫描本地网络中存活的主机,以C类地址为例


#variables
netsub="192.168.1."

#main
#1、循环ping IP地址,能ping通说明IP存在。
for ip in `seq 1 254`
  do
  (  
     #2、判断Ping结果
     if ping -c1 $netsub$ip &>/dev/null;then
          #3、输出结果
          echo "$netsub$ip is open"
     else
          echo "$netsub$ip is close"
     fi
   ) & 
done

一、for嵌套

1.1、for嵌套if

案例: 输出1-9,当输出5时停止输出

案例代码

#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time: 
#Release: 
#Description:输出1-9,当输出5时停止输出

for ((num=1;num<10;num++))
   do
     echo $num
     [ $num -eq 5 ]&& break
done

1.2、for嵌套for 案例: 打印99乘法表

案例代码

#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time: 
#Release: 
#Description: 
#打印99乘法表,思考A*B的关系
for ((A=1;A<=9;A++))
  do
     for ((B=1;B<=$A;B++))
        do
           echo -n -e "$B*$A=$((A*B)) \t"
     done
     #换行
     echo 
done

二、for与数组

for循环与数组

2.1、使用for循环遍历读出数组

name=('tom' 'jarry' 'harry' 'barry')
for i in 0 1 2 3
  do
      echo ${name[$i]}
 done

2.2、使用for循环进行数组存值

for i in `seq 0 9`
  do
     read -p "name: " name[$i]
 done
 echo ${name[@]}

while在shell中也是负责循环的语句,和for一样。因为功能一样,很多人在学习和工作中的脚本遇到循环到底该使用for还是while呢?很多人不知道,就造就了有人一遇到循环就是for或者一位的while。我个人认为可以按照我说的这个思想来使用,既知道循环次数就可以用for,比如说一天需要循环24次;如果不知道代码要循环多少次,那就用while,比如我们作业中要求写的猜数字,每个人猜对一个数字的次数都是不能固定的,也是未知的。所以这样的循环我就建议大家用while了。

一、while介绍

特点:条件为真就进入循环;条件为假就退出循环,一般应用在未知循环次数的环境。

1.1、while语法

while [ 表达式 ]
    do
        command...
    done

while  [ 1 -eq 1 ]    或者 (( 1 > 2 ))
  do
     command
     command
     ...
 done

案例 使用for循环和while循环分别循环打印数组1-5

案例代码

for循环打印:
for ((i=1;i<=5;i++))
do
    echo $i
done

while循环打印:
#打印数字1-5
#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time: 
#Release: 
#Description: 打印1-5

num=1
while [ $num -le 5 ]
  do
      echo $num
      let num++
done

备注: 知道循环次数就可以用for,比如说一天需要循环24次;如果不知道代码要循环多少次,那就用while,比如我们作业中要求写的猜数字,每个人猜对一个数字的次数都是不能固定的,也是未知的。

二、while与shell运算

2.1、比较运算

案例: 循环交互输入一个小写字母,按Q退出循环

案例代码

#按Q退出场景
#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time: 
#Release: 
#Description: 
read -p "请输入一个小写字母,按Q退出: " choose
while [ $choose != 'Q' ]
  do
     echo "你输入的是: $choose"
     read -p "请输入一个小写字母,按Q退出: " choose
done

2.2、逻辑运算

案例: 使用循环语句帮助丈母娘批量选择女婿

案例代码

#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time: 
#Release: 
#Description: 

#丈母娘选女婿  分别按照姑娘20  30   40 进行与或非模拟

#1.第一个应征者回答
read -p "你有多少钱: " money
read -p "你有多少车: " car
read -p "你家房子有几套: " house


#while [ $money -lt 10000 ]&&[ $car -lt 1 ]&&[ $house -lt 2 ]
while [ $money -lt 10000 ]||[ $car -lt 1 ]||[ $house -lt 2 ]
  do
     #应征者不满住条件开始下一次循环
     echo "有请下一个"
     read -p "你有多少钱: " money
     read -p "你有多少车: " car
     read -p "你家房子有几套: " house
done

#应征者满足条件
echo  "乖女婿,你怎么才来啊!女儿给你了"

2.3、文件类型判断

案例: 使用循环判断/tmp/xxx目录下的文件,如果不是文件类型的打印字符串"目录"

案例代码

文件类型判断
#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time: 
#Release: 
#Description: 

while [ ! -f /tmp/xxx ]
 do
   echo “目录”
   sleep 1
done

2.4、特殊条件

while语句中可以使用特殊条件来进行循环:

  • 符号":" 条件代表真,适用与无限循环
  • 字符串 “true” 条件代表真,适用与无限循环
  • 字符串 "false"条件代表假

代码展示

特殊符号 :  代表真
#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time: 
#Release: 
#Description: 

while : 
 do
   echo haha
   sleep 1
done


true 字符串代表真,和:类似
#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time:
#Release: 
#Description: 

while true
 do
   echo haha
   sleep 1
done


false   字符串代表假,在while中不会开始循环

三、while与循环控制语句

3.1、sleep语句

#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time: 
#Release: 
#Description: 倒计时游戏

#1.定义初始值
time=9

#2.循环输出,1秒一次
while [ $time -ge 0 ]
  do
     echo -n -e  "\b$time"
     let time--
     #控制循环 1秒一次 
     sleep 1
done

#回车
echo

3.2、break

#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time: 
#Release: 
#Description: 输出数字1-9,当输出5时停止

#1、定义初始值
num=1

while [ $num -lt 10 ]
  do
     echo $num

     #判断当前num的值,如果等于5就跳出循环
     if [ $num -eq 5 ]
        then
        break
     fi

     #自动累加
     let num++
done

3.3、continue

#!/bin/bash
# 
#Author: 
#Created Time: 
#Release: 
#Description: 输出数字1-9,当等于5时跳过本次循环,输出1、2、3、4、6、7、8、9

#1、定义初始值
num=0

while [ $num -lt 9 ]
  do
     #自动累加
     let num++

     #判断当前num的值,如果等于5就跳过本次循环
     if [ $num -eq 5 ]
        then
        continue
     fi

     #输出num的值
     echo $num
done

四、while嵌套其他语句

4.1、while嵌套if

#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time: 
#Release: 
#Description: 输出数字1-9,当输出5时停止

#1、定义初始值
num=1

while [ $num -lt 10 ]
  do
     echo $num

     #判断当前num的值,如果等于5就跳出循环
     if [ $num -eq 5 ]
        then
        break
     fi

     #自动累加
     let num++
done

4.2、while嵌套for

#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time: 
#Release: 
#Description: 99乘法表

A=1
while [ $A -lt 10 ]
  do
    for ((B=1;B<=$A;B++))
       do
      echo -n -e "$B*$A=$((A*B)) \t"
   done
   echo 
   let A++
done

4.3、while嵌套while

#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time: 
#Release: 
#Description: 99乘法表

#定义A
A=1
while [ $A -lt 10 ]
  do
      #定义B
      B=1
      while [ $B -le $A ]
        do
          echo -n -e "$B*$A=$((A*B)) \t"
          let B++
      done

   echo 
   let A++
done

一、循环语句-until

系统中还有一个类似while的循环语句,大家可以看看until语句,不同于while的是,当条件为假时开始until循环。

1.1、until介绍

特点:条件为假就进入循环;条件为真就退出循环

1.2、until语法

until expression   [ 1 -eq 1 ]  (( 1 >= 1 ))
    do
        command
        command
        ...
    done

二、案例:

使用while循环和until循环打印数字接龙,要求while循环输出1-5,until循环输出6-9.

案例代码

#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time: 
#Release: 
#Description: 数字接龙

i=1
while [ $i -le 5 ]
do
    echo $i
    let i++
    until [ $i -le 5 ]
        do
            echo $i
                let i++
                [ $i -eq 10 ]&&break
    done
done

一、循环控制-break语句

作用: 终止循环,执行循环体后面的代码 案例: 循环打印输出数字1到9,当执行输出到5时终止循环。

要求输出:
1
2
3
4

执行完毕

案例代码

#!/bin/bash
#Author: www.zuolaoshi.cn
#Created Time: 
#Script Description: 

for i in `seq 1 9`
  do
      echo $i
      if [ $i -eq 5 ]
                then
                break
            fi
done


echo "执行完毕"

二、循环控制-continue语句

作用: 跳过某次循环,继续执行下一次循环;表示循环体内下面的代码不执行,重新开始下一次循环

案例: 循环打印输出数字1到9,当执行输出到5时跳过本次循环。

要求输出:
1
2
3
4
6
7
8
9
执行完毕

案例代码

#!/bin/bash
#Author: www.zuolaoshi.cn
#Created Time: 
#Script Description: 
for ((i=1;i<10;i++))
   do
       if [ $i -eq 5 ]
      then 
        continue
    else
        echo $i
    fi

done
echo "执行完毕"

三、循环控制-sleep

作用: 控制循环的节奏,控制循环频率 当执行一个无限循环语句的时候,如果任意其循环那么该循环就会疯狂的消耗计算机的内存和CPU资源,消耗最大的就是CPU,所以一个循环不可能让其肆意循环,必须控制其循环的节奏,可以使用sleep语句来完成。

案例: 写一个倒计时程序:从9到1,每秒倒数一次。

案例代码

#!/bin/bash
#Author: 
#Created Time: 
#Script Description: 

echo -n "倒计时: "
for i in `seq 9 -1 1`
   do
      echo -n -e "\b$i"
      sleep 1
done
echo 
echo "执行完毕"

四、参数控制命令-shift

作用: 外部传参到循环时,参数管理命令 使位置参数向左移动,默认移动1位,可以使用shift 2 传参要是N的整数倍

案例: 通过外部传参的方式向脚本内的循环传递参数,要求打印每次循环使用的参数。

案例代码

#!/bin/bash
# 
#Author: www.zuolaoshi.cn
#Created Time: 
#Release: 
#Description: 
#1、判断外传参的数量
[ $# -lt 3 ]&&echo '请输入至少三个参数:'$0' $1 $2 $3 ...'&&exit 1

#将参数的数量赋值给count
count=$#

#通过shift左移参数输出
#使位置参数向左移动,默认移动1位,可以使用shift 2 传参要是N的整数倍
for ((i=1;i<=$count;i++))
  do
    echo '参数数量: '$#''
    echo '当前$1的数值是: '$1''
    shift 1
    sleep 1
done
echo "执行完毕"

五、脚本退出命令-exit

作用: 退出程序并释放占用的系统资源

案例: 循环输出数字1-9,当循环到5时退出脚本。

案例代码

#!/bin/bash
#Author: www.zuolaoshi.cn
#Created Time: 
#Script Description: 

for i in `seq 1 9`
  do
      echo $i
      if [ $i -eq 5 ]
    then
       exit 0  
    fi
done
echo "执行完毕"

六、作业

break 和 exit语句的区别