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 
posted @ 2022-06-09 18:19  秋风お亦冷  阅读(31)  评论(0编辑  收藏  举报