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
原文地址:https://www.cnblogs.com/tcy1/p/13578677.html