shell阶段-day7-流程控制之while循环
文章目录
流程控制之while循环
一、语法
1.语句结构:条件为真时,执行循环体代码
while 条件
do
循环体
done
2.until语法结构:条件为假时,一直执行循环体代码,直到条件变为真
until 条件
do
循环体
done
# PS:while与until的区别:两者判断正好相反
二、简单示例
[root@aliyun test]# cat a.sh
#!/bin/bash
# x<3,即x=3时立刻结束循环且不打印,y=3时不打印,结束循环;其实两者的结果相同
x=0
while (($x < 3))
do
echo $x
let x++
done
echo "================"
y=0
until (($y == 3))
do
echo $y
let y++
done
[root@aliyun test]# ./a.sh
0
1
2
================
0
1
2
二、continue与break
1、区别
continue # 默认退出本次循环
break # 默认退出本层循环
2、示例
[root@aliyun test]# cat a.sh
#!/bin/bash
# 判断x=2时,结束本次循环,进入下个if;x=7时,结束本层循环,进入y判断,则打印0123456;
# 判断y同上;
x=0
while (($x < 10))
do
if (($x == 2));then
let x++
continue
fi
if (($x == 7));then
break
fi
echo $x
let x++
done
echo "================"
y=0
until (($y == 10))
do
if (($y == 2));then
let y++
continue
fi
if (($y == 7));then
break
fi
echo $y
let y++
done
[root@aliyun test]# ./a.sh
0
1
3
4
5
6
================
0
1
3
4
5
6
三、案例
1、监控web页面
要求:监控web页面的状态信息, 若失败3次, 表示网站出现问题,需要进行报警
1.编写脚本
[root@aliyun test]# cat f.sh
#!/bin/bash
timeout=3
fails=0
success=0
url=$1
while true
do
echo "=====>$fails"
if [ $fails -eq 3 ]
then
echo "fails值等于3代表要进行第4次尝试,证明页面前访问3次均失败"
break
fi
wget --timeout=$timeout --tries=1 http://$url -q
if [ $? -ne 0 ]
then
let fails++
else
echo "页面访问成功"
break
fi
done
2.执行脚本
[root@aliyun test]# ./f.sh www.egon.com.cn
=====>0
=====>1
=====>2
=====>3
fails值等于3代表要进行第4次尝试,证明页面前访问3次均失败
2、猜数字
# 补充知识
方法一: 通过random变量产生随机数 (0-32768)
echo $RANDOM
方法二: 通过openssl命令产生随机数
openssl rand -base64 10
方法三: 通过时间信息获取随机数
date +%S%N
方法四: 通过一个特殊设备文件生成随机数
head -c9 /dev/urandom|cksum
tr -dc 0-9 < /dev/urandom | head -c8
方法五: 利用UUID文件生成随机数
cat /proc/sys/kernel/random/uuid
1.编写脚本
[root@m01 while]# cat guess_age.sh
#!/bin/bash
num=`echo $((RANDOM%100+1))`
count=0
while :
do
[ $count -eq 3 ] && echo "猜的次数以超过三次,游戏自动结束,你输了!" && exit
read -p "请输入0~100之间的数值进行猜测>>>" x
[[ ! $x =~ [0-9]+$ ]] && echo "必须输入纯数字!" && continue
if [ $x -gt $num ];then
echo "猜大了~"
elif [ $x -lt $num ];then
echo "猜小了~"
else
echo "猜对了!"
echo "游戏结束,你赢了!"
break
fi
let count++
done
3、while循环登录脚本
1.简易版 # 输入过程不能删除,且无论对错都循环执行
[root@m01 while]# vim while_login.sh
#!/bin/bash
# 无论登陆成功与否,都会打印相应的登录提示信息,且无限循环执行登录步骤
while :
do
read -p "请输入用户名>>>" user
read -p "请输入密码>>>" pwd
if [ $user == "egon" ] && [ $pwd == "123" ];then
echo "登陆成功!"
else
echo "用户名或密码错误,请重试···"
fi
done
2.升级版 # 循环登录超过三次禁止登录并退出,且判断若不是输入大、小写字母或数字就给与提示
[root@m01 while]# vim while_login2.sh
#!/bin/bash
# 循环登录超过三次禁止登录并退出,且判断若不是输入大、小写字母或数字就给与提示
i=1
while ((i<4))
do
read -p "请输入用户名>>>" user
read -p "请输入密码>>>" pwd
[[ ! $user =~ [a-z,A-Z,0-9]+$ ]] && echo "========提示:'用户名'只能输入字母或数字~"
[[ ! $pwd =~ [a-z,A-Z,0-9]+$ ]] && echo "========提示:'密码'只能输入字母或数字~"
if [ $user == "egon" ] && [ $pwd == "123" ];then
echo "登陆成功!"
break
else
echo "========验证登录失败,请重试···"
fi
((i++))
done
4、until
语法结构:条件为假时,一直执行循环体代码,直到条件变为真
until 条件
do
循环体
done
[root@egon /]# cat 4.sh
#!/bin/bash
i=0
until [ $i -gt 4 ]
do
if [ $i == 2 -o $i == 3 ];then
let i++
continue
fi
echo $i
let i++
done
[root@egon /]# . 4.sh
0
1
4
案例5:while循环
[root@egon /]# cat 1.sh
#!/bin/bash
i=1
while ((i<10))
do
echo $i
((i++))
done
[root@egon /]# . 1.sh
1
2
3
4
5
6
7
8
9
案例6:while循环
[root@egon /]# cat 2.sh
#!/bin/bash
var1="AAA"
var2="BBB"
var3="CCC"
while :
do
clear
echo -e "1:${var1}\n2:${var2}\n3:${var3}"
temp=$var1
var1=$var2
var2=$var3
var3=$temp
sleep 1
done
案例7:while和read实现逐行处理
[root@egon /]# cat 3.sh
#!/bin/bash
i=0
while read line
do
echo $i:$line
let i++
done</etc/passwd
案例8:用while循环+case来制作一个简单的菜单功能
#!/bin/bash
echo "script name: `basename $0`"
echo "version 1.0"
echo `date +%F_%H:%M:%S`
echo "Author: egon"
while read -p "(h for help): " var
do
case $var in
p|P|cpu|CPU)
echo -e "\n\n"
grep 'model name\|cpu MHz\|processor' /proc/cpuinfo |sort |uniq
echo -e "\n\n"
;;
m|m|mem|MEM)
echo -e "\n\n"
free
echo -e "\n\n"
;;
d|D|disk|DISK)
echo -e "\n\n"
df -Th
echo -e "\n\n"
;;
h|H|help|HELP)
echo -e "\n\tcommand\taction\n\n"
for i in cpu mem disk
do
echo -e "\t$i\t${i}_info"
done
echo -e "\thelp\tthis help page.."
echo -e "\tquit\texit !!.."
echo -e "\n\n"
;;
q|Q|quit|exit)
exit
;;
*)
echo -e "\n$var Enter Error...\n"
esac
done
9、三中循环方式求1~100的和
三中循环方式求1~100的和:要求使用for,while,until
1.利用for循环
#!/bin/bash
for i in {1..100}
do
#let sum=$sum+$i
let sum+=$i
done
echo "sum:$sum"
2.利用while循环
#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
#let sum=$sum+$i
let sum+=$i
let i++
done
echo "sum:$sum"
3.利用until
#!/bin/bash
i=1
until [ $i -gt 100 ]
do
#let sum=$sum+$i
let sum+=$i
let i++
done
echo "sum:$sum"
10、三中循环方式区别总结
循环文件建议:使用while循环
循环次数固定:建议使用for循环
循环次数不固定:建议使用while和until循环
11、循环嵌套
一个循环体内又包含另一个完整的循环结构,在外部循环的每次执行过程中都会触发内部循环,for、while、until可以相互嵌套
要求:利用for嵌套循环,实现九九乘法表
1.编写脚本
[root@m01 while]# sh for.sh
#!/bin/bash
for (( i = 1; i <= 9; i++ ))
do
for (( j =1; j <= i; j++ ))
do
let "x = i * j"
echo -n "$i*$j=$x "
done
echo ""
done
2.测试效果
[root@m01 while]# sh for.sh
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81