• SHELL使用--while循环


    while循环

    while循环语法

    ` 前提: 条件为true就执行循环体代码,条件变为false循环结束 `
    
    # 语法:
    while 条件
    do
        命令1
        命令2
        命令3
        ...
    done
    
    ================================
    #示例(最开始的值为0,依次循环,直到满足条件count等于或者大于5,就停止循环,停止循环的前提就是条件变成false)
    #!/bin/bash
    count=0
    while [ $count -lt 5 ] 
    do
        echo $count 
        let count++ 
    done
    

    until语法

    ` 条件为false就执行循环体代码,条件变为true循环结束 `
    
    # until语法:
    until 条件
    do
        命令1
        命令2
        命令3
        ...
    done
    
    ================================
    # 示例(条件不满足就执行,一旦满足就退出循环,这里初始值为0,每次都自增,一旦等于5就停止循环)
    #!/bin/bash
    count=0
    until [ $count -eq 5 ]   
    do
        echo $count 
        let count++  # 5
    done
    

    循环结束命令

    `break` :
    - 立即终止本层循环(当前的while循环直接退出,break后面的指令都不会执行,但当前级别之上还有循环,就执行上级别循环,否则直接退出脚本。)
    
    `continue` :
    终止本次循环(当前循环下面的命令都不会被执行,但本次循环结束后任然会继续执行本层的循环。)
    
    # 示例:
    #!/bin/bash
    count=0
    while [ $count -lt 5 ] 
    do
        if [ $count -eq 3 ];then
            # break
            let count++
            continue
        fi
        echo $count 
        let count++ 
    done
    
    # 输出结果:
    [root@db01 day05]# ./test1.sh 
    0
    1
    2
    4
    # 这里注意,不能将let count++放到continue下方,因为continue退出方式,不会执行它自身下方的任何指令,那当值为3时不会自增,将一直为3。
    

    循环结束方案

    方案一:条件为假

    # 这里直接在循环当中为count进行赋值操作,所以第一次结果会完全显示,但是当第二次循环count值匹配大于3,将不会执行此循环
    [root@egon day05]# cat test.sh 
    #!/bin/bash
    count=0
    while [ $count -lt 3 ]
    do
        echo 1111
        count=100
        echo 2222
        echo 3333
    done
    [root@egon day05]# ./test.sh 
    1111
    2222
    3333
    

    方案二:break

    # 使用break的方式直接退出本层循环,break后续操作将不再被执行
    
    [root@egon day05]# cat test.sh 
    #!/bin/bash
    count=0
    while [ $count -lt 3 ]
    do
        echo 1111
        #count=100
        break
        echo 2222
        echo 3333
    done
    [root@egon day05]# ./test.sh 
    1111
    

    方案三:多层嵌套循环退出(了解)

    # break结束嵌套多层的循环(可使用break 3,指定退出三层的循环,否则break只会退出本层的循环体)
    while 条件1
    do
    	while 条件2
        do
            while 条件3
            do
            	break 3
            done
            # break
        done
        # break
    done
        
        
    # 把条件改为false,最里层的条件改变直接影响了,三层的改变。
    tag=true
    while $tag
    do
    	while $tag
        do
            while $tag
            do
            	tag=false
            done
        done
    done
    

    案例一:登录脚本

    # 如果用户名密码正确,直接退出本层循环,这里也就直接退出脚本,但输入错误,则提示密码错误,然后循环此次脚本。
    [root@egon day05]# cat login_new.sh 
    #!/bin/bash
    tag=true
    while $tag
    do
        read -p "用户名:" name
        read -p "密码:" pass
        if [ $name == "egon" ] && [ $pass == "123" ];then
            echo "login successful"
            #tag=false
            break
        else
            echo "user or password error"
        fi
    done
    

    案例二:登录脚本升级版

    # 升级版,多了一个功能,针对用户输入正确后,再进入一个循环,循环体内模拟了命令提示符功能,并在循环体内发现执行q即退出。
    
    #!/bin/bash
    while true
    do
        read -p "用户名:" name
        read -p "密码:" pass
    
        if [ $name == "egon" ] && [ $pass == "123" ];then
            echo "login successful"
        	while true
            do
                read -p "[root@egon ------->]# " cmd
                if [ $cmd == "q" ];then
                    break
                fi
                $cmd
        	done
            break
        else
            echo "user or password error"
            # continue  # 不要画蛇添足,写与不写都会再次循环,并且退出此次循环
        fi
    done
    

    案例三:网站测试

    # 网站可以访问即输出一个ok,如果网站访问超过三次任然无法访问,就提示报警
    [root@egon day05]# cat check_web.sh 
    #!/bin/bash
    [ $# -ne 1 ] && echo "只能输入一个参数" && exit
    url=$1
    count=0
    while true
    do
        echo "=========>$count"
        if [ $count -eq 3 ];then
            echo "报警:$url is dead"
            break
        fi    
        wget --timeout=1 --tries=3 $url -q
        if [ $? -eq 0 ];then
            echo "$url is ok"
            break
        else
    	let count++        
        fi
    done
    
    ============================================== `结果显示` =====================
    [root@egon day05]# ./check_web.sh 
    只能输入一个参数
    [root@egon day05]# ./check_web.sh www.baidu.com
    =========>0
    www.baidu.com is ok
    [root@egon day05]# ./check_web.sh www.egon.com.cn
    =========>0
    =========>1
    =========>2
    =========>3
    报警:www.egon.com.cn is dead
    

    案例三:while读取文件

    # 可以将文件中的内容一行行进行读取
    [root@egon day05]# cat 6.sh
    #!/bin/bash
    while read line
    do
        echo $line
    done < a.txt
    [root@egon day05]# ./6.sh 
    11111 1:1 1
    22222
    3333
    4444
    

    案例四:动态监控系统

    # 使用while循环free命令,每次间隔0.5秒,实现和top相似功能
    [root@egon ~]# while :;do free;sleep 0.5;clear;done
    
  • 相关阅读:
    iOS开发中常见错误总结(1)
    iOS开发——OC篇&纯代码退出键盘
    获取下拉框
    @RequestBody 注解
    form 表单提交
    数据库excel导出
    状态模式
    图书网上商城实现(一)
    MongoDB(一)—— 搭建环境和启动服务
    MySQL开发遇到的问题
  • 原文地址:https://www.cnblogs.com/tcy1/p/13578677.html
Copyright © 2020-2023  润新知