一,语法
1, while
while语法: 条件为真,则运行循环体代码,直到条件变成假的则结束循环;又叫条件循环
while 条件
do
代码1
代码2
done
案例
[root@\ m01~]# vim /script/while.sh
#!/bin/bash
count=0
while [ $count -lt 8 ]
do
echo $count
let count++
done
[root@\ web01~]# chmod +x /script/while.sh
[root@\ m01~]# /script/while.sh
0
1
2
3
4
5
6
7
2, until
until语法(了解即可):条件为假,才运行循环代码,直到条件为真则结束循环
while 条件
do
代码1
代码2
done
案例:
[root@\ m01~]# vim /script/until.sh
#!/bin/bash
count=0
until [ $count -gt 7 ]
do
echo $count
let count++
done
[root@\ m01~]# /script/until.sh
0
1
2
3
4
5
6
7
3,死循环
[root@\ m01~]# while :;do echo 1;echo 2;echo 3;echo 4;done
## 这里的冒号代表永远为真;等同于
[root@\ m01~]# vim /script/test.sh
#!/bin/bash
while [ 1 -eq 1 ]
do
echo 1
done
另一种python死循环
[root@\ m01~]# vim /script/test.py
while True:
1 + 1
# 放在后台执行
[root@\ m01~]# python /script/test.py &
[1] 42643
查看top的平均负载及cpu变化
[root@\ m01~]# top
top - 12:35:49 up 1 day, 16:51, 3 users, load average: 1.74, 1.25, 1.12
Tasks: 111 total, 2 running, 109 sleeping, 0 stopped, 0 zombie
%Cpu(s): 99.7 us, 0.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995896 total, 343492 free, 140348 used, 512056 buff/cache
KiB Swap: 1048572 total, 1047028 free, 1544 used. 605168 avail Mem
... ...
load average: 1.74, 1.25, 1.12代表最近一分钟 五分钟 十分钟的平均负载
以及观察%Cpu(s): 99.7 us值
=============结束死循环的两种方式
1.条件为假
[root@\ web01/script]# vim while2.sh#!/bin/bash
tag=true
while $tag
do
echo 1
echo 2
echo 3
tag=false
done
验证
[root@\ web01/script]# chmod +x /script/while2.sh
[root@\ web01/script]# ./while2.sh
1
2
3
2.break
#1)第一种方式
[root@\ web01/script]# vim while2.sh
#!/bin/bash
tag=true
while $tag
do
echo 1
echo 2
echo 3
break
done
#2)第二种方式
[root@\ web01/script]# vim while.sh
#!/bin/bash
count=0
while [ $count -lt 8 ]
if [ $count -lt 4 ];then
break
fi
do
echo $count
let count++
done
验证:
[root@\ web01/script]# ./while2.sh
1
2
3
以上两种区别
[root@\ web01/script]# vim while2.sh
#!/bin/bash
tag=true
while $tag
do
echo 1
echo 2
echo 3
tag=false
echo 99999999
echo 666
done
[root@\ web01/script]# ./while2.sh
1
2
3
99999999
666
2)
[root@\ web01/script]# vim while2.sh
#!/bin/bash
tag=true
while $tag
do
echo 1
echo 2
echo 3
break
echo 99999999
echo 666
done
[root@\ web01/script]# ./while2.sh
1
2
3
总结:
第一种的,会判断条件为假时,才会停止;
第二种会即可停止
3. continue # 案例- 跳过3
[root@\ web01/script]# vim while.3.sh
#!/bin/bash
count=0
while [ $count -lt 6 ]
do
if [ $count -eq 3 ];
let count++
continue
fi
echo $count
let count++
done
[root@\ web01/script]# ./while.3.sh
0
1
2
4
5
二,实战案例
1,用户登陆
[root@m01~]# vim /script/login.sh
#!/bin/bash
while true
do
db_name=zx
db_pwd=123
read -p "请输入用户名:" inp_name
read -p "请输入用户名密码:" inp_pwd
if [ $inp_name = $db_name ] && [ $inp_pwd = $db_pwd ];then
echo "登陆成功"
break
else
echo "登陆失败"
fi
done
[root@m01~]# /script/login.sh
请输入用户名:wq
请输入用户名密码:wq
登陆失败
请输入用户名:wq
请输入用户名密码:wq
登陆失败
请输入用户名:zx
请输入用户名密码:123
登陆成功
注意:以上脚本输入正确会退出,
输入错误会无限循环继续登陆,会导致用户试出密码,不安全
限制输入三次错误密码,即退出
优化脚本:
[root@m01~]# vim /script/login.sh
#!/bin/bash
while true
do
db_name=zx
db_pwd=123
read -p "请输入用户名:" inp_name
read -p "请输入用户名密码:" inp_pwd
if [ $inp_name = $db_name ] && [ $inp_pwd = $db_pwd ];then
echo "登陆成功"
break
else
echo "登陆失败"
let count++
fi
if [ $count -eq 3 ];then
echo "已错误输入3次"
break
fi
done
[root@m01~]# /script/login.sh
请输入用户名:qw
请输入用户名密码:qw
登陆失败
请输入用户名:we
请输入用户名密码:we
登陆失败
请输入用户名:er
请输入用户名密码:rt
登陆失败
已错误输入3次
完整版:
#!/bin/bash
while true
do
db_name=zx
db_pwd=123
read -p "请输入用户名:" inp_name
read -p "请输入用户名密码:" inp_pwd
if [ $inp_name = $db_name ] && [ $inp_pwd = $db_pwd ];then
echo "登陆成功"
while true
do
echo "0 退出"
echo "1 取款"
echo "2 转账"
echo "3 查询余额"
read -p "请输入编码:" code
case $code in
"0")
break
;;
"1")
echo "正在取款..."
;;
"2")
echo "正在转账..."
;;
"3")
echo "正在查询余额"
;;
*)
echo "请选择正确的编码"
esac
done
break
else
echo "登陆失败"
let count++
fi
if [ $count -eq 3 ];then
echo "已错误输入3次"
break
fi
done
[root@m01~]# /script/login.sh
请输入用户名:zx
请输入用户名密码:123
登陆成功
0 退出
1 取款
2 转账
3 查询余额
请输入编码:03
请选择正确的编码
0 退出
1 取款
2 转账
3 查询余额
请输入编码:0
2,while循环读取文件,设置文件格式
[root@m01~]# vim /script/while3.sh
#!/bin/bash
while read line
do
echo "...$line..."
done</etc/passwd
[root@m01~]# chmod +x /script/while3.sh
[root@m01~]# /script/while3.sh
...root:x:0:0:root:/root:/bin/bash...
...bin:x:1:1:bin:/bin:/sbin/nologin...
...daemon:x:2:2:daemon:/sbin:/sbin/nologin...
... ...
网友评论