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