您的位置:首页 > 汽车 > 时评 > 32、循环语句while+until

32、循环语句while+until

2024/7/2 4:32:07 来源:https://blog.csdn.net/m0_74149099/article/details/139750053  浏览:    关键词:32、循环语句while+until

一、循环控制语句

双层循环和循环语句的使用,while和until的语法使用

1.1、echo 打印

continue:跳出当次,后续的条件成立,继续执行。

break:一旦break,后续的条件不再执行。

exit:满足条件,立刻提出,不论有几层。

-n :表示不换行输出

-e :输出转义字符

\b:相当于退格键(backspace)

\n:换行相当于回车

\f:换行,换行后的新行的开头连着上一行的行尾

\t:相当于tab键 横向制表符

echo -ne

[root@test1 opt]# vim test31.shfor i in {1..9}
do
for j in {1..9}
do
echo -n $j
done
done#1
#123456789
#2
#123456789
.....[root@test1 opt]# sh test31.sh
123456789[root@test1 opt]# 
[root@test1 opt]# vim test31.shfor i in {1..9}
dofor j in {1..9}doif [[ $j -le $i ]]thenecho -n $(($i*$j))   ##漂亮输出echo -ne "$i*$j=$(($i*$j))\t" fidoneecho
done[root@test1 opt]# sh test31.sh
1
24
369
481216
510152025
61218243036
7142128354249
816243240485664
91827364554637281
[root@test1 opt]# vim test32.shfor ((i=5;i>=1;i--))
do
for ((j=1;j<=i;j++))doecho -ne "$i*$j=$(($i*$j))\t" doneecho
done[root@test1 opt]# sh test32.sh
5*1=5	5*2=10	5*3=15	5*4=20	5*5=25	
4*1=4	4*2=8	4*3=12	4*4=16	
3*1=3	3*2=6	3*3=9	
2*1=2	2*2=4	
1*1=1	

在这里插入图片描述

1.2、break

for i in {1..3}
dofor j in {1..5}doif [ $j -eq 3 ]thenbreak 2  #跳出2层循环
#循环控制,continue'和break默认值就是1fiecho $j
done
#echo $i
done
~     

1.3、ontinue

[root@test1 opt]# vim test33.shfor i in {1..3}
dofor j in {1..5}doif [ $j -eq 3 ]thencontinue 
#循环控制,continue'和break默认值就是1fiecho $j
done
echo $i
done[root@test1 opt]# sh test33.sh
1
2
4
5
1
1
2
4
5
2
1
2
4
5
3
[root@test1 opt]# vim test33.shfor i in {1..3}
dofor j in {1..5}doif [ $j -eq 3 ]thencontinue 2
#循环控制,continue'和break默认值就是1fiecho $j
done
echo $i
done[root@test1 opt]# sh test33.sh
1
2   #continue 2,  第一层(内层)循环结束,第二层(外层)也结束了,重新开始
1
2
1
2

在这里插入图片描述

1.4、exit ##满足条件,立刻退出,退出全部循环体

set -x

sex -x

#关闭调试模式

1.5、while语法:

while满足条件就执行循环,不满足条件才会退出。

死循环,不知道循环多少次,需要主动结束循环或者达到条件才结束循环

while [判断条件]

do

命令序列

done

[root@test1 opt]# vim test34.shi=1
sum=0
while [ $i -le 100 ]
do
sum=$(($sum+$i))
let i++
done
echo $sum[root@test1 opt]# sh test34.sh
5050
[root@test1 opt]# vim test35.shi=1
sum=0
while [ $i -lt 101 ]
do
sum=$(($sum+$i))
let i++
done
echo $sum[root@test1 opt]# sh test35.sh
5050
[root@test1 opt]# vim test35.shi=0
sum=0
while [ $i -lt 100 ]
do
sum=$(($sum+$i))
let i++
done
echo $sum[root@test1 opt]# sh test35.sh
4950
[root@test1 opt]# vim test35.shi=0
sum=0
while [ $i -lt 100 ]
do
let i++
sum=$(($sum+$i))
done
echo $sum
~            [root@test1 opt]# sh test35.sh
5050

在这里插入图片描述

[root@test1 opt]# vim test35.shi=0
sum1=0
sum2=0
while [ $i -lt 100 ]
do
let i++
if [[ $i%2 -eq 0 ]]
then
sum1=$(($sum1+$i))
else
sum2=$(($sum2+$i))
fi
done
echo $sum1
echo $sum2[root@test1 opt]# sh test35.sh
2550
2500

1.5.1、while 死循环:

while true #永远为真,死循环

while [ 1 -eq 1 ]

while:

1.6、until的语法:

until循环:条件不满足才执行循环,一旦条件成立,循环终止

until [ 条件测试 ]

do

命令序列

done

[root@test1 opt]# vim test36.shi=0
until [[ $i -gt 10 ]]
do
let i++
echo $i
done[root@test1 opt]# sh test36.sh
1
2
3
4
5
6
7
8
9
10
11
#打印出/opt下文件和目录
[root@test1 opt]# vim test36.shfor i in /opt/*
do
echo $i
done[root@test1 opt]# sh test36.sh
/opt/!
/opt/11
/opt/123
/opt/123.tar.gz
/opt/1.sh
/opt/222
/opt/2.sh
/opt/333
/opt/3.sh
/opt/456
/opt/4.sh
/opt/7.sh
/opt/hosts.txt
/opt/login.sh
/opt/nginx-1.22.0
/opt/nginx-1.22.0.tar.gz
/opt/passwd.txt
/opt/test11.sh
/opt/test12.sh
/opt/test13.sh
/opt/test14.sh
/opt/test15.sh
/opt/test16.sh
/opt/test17.sh
/opt/test21.sh
/opt/test22.sh
/opt/test23.sh
/opt/test31.sh
/opt/test32.sg
/opt/test32.sh
/opt/test33.sh
/opt/test34.sh
/opt/test35.sh
/opt/test36.sh
/opt/test6.sh

在这里插入图片描述

#测试网段,c类私有地址,32位网段,测试可以ping通的保留到/opt/hosts.txt,ping不同,提示不通即可。1-254

[root@test1 opt]# vim test37.shfor i in {1..254}
do
ping -c 2 192.168.168.$i
if [[ $? -eq 0 ]]
then
echo 192.168.168.$i >> /opt/hosts1.txt
else
echo "ping不通"
fi
done
~        [root@test1 opt]# cat hosts1.txt
2
10
192.168.168.2
192.168.168.10

在这里插入图片描述

{循环体}&
#把整个循环体的代码看作一个整个内容,相当于并行,&循环成立的内容放入后台执行
donewait
#计算器,实现整数的+,-,*,/,%
for ((;;))
do
read -p "输入计算数1:" a
read -p "输入计算符:" b
read -p "输入计算数2:" c
sum=$(($a$b$c))
read -p "是否继续" d
if [[ $d == yes ]]
then
echo $sum
else
echo $sum
echo "计算结束"
break
fi
done

[root@test1 opt]# vim test39.sh

在这里插入图片描述

#我们定义好了一个密码,脚本判断密码输入是否正确,正确密码是123456,输入>正确,提示输入正确,输入3次密码错误,提示密码已被锁定。
for ((i=1;i<=3;i++))
doread -p "输入密码" aif [[ $a == "123456" ]]thenecho "密码输入正确"breakelif [[ $i -eq 3 ]]thenecho "输入3次错误,密码已经被锁定"elseecho "密码输入错误"fi
done[root@test1 opt]# sh test39.sh
输入密码21
密码输入错误
输入密码123
密码输入错误
输入密码123
输入3次错误,密码已经被锁定

在这里插入图片描述
在这里插入图片描述

密码为空

在这里插入图片描述
在这里插入图片描述

二、作业

作业1:

#用户名存放在users.txt文件中,每行一个。判断文件里的用户名是否存在

#如果用户用户存在,提示用户已存在

#用户存在,但是没有设置密码,要提示用户设置密码

#用户不存在,创建用户,然后给用户创建密码

for user in $(cat /opt/users.txt)
do
cat /etc/passwd | awk -F: '{print $1}' | grep "$user"
if [[ $? -eq 0 ]]thenecho "用户存在"
mima=$(cat /etc/shadow | grep "$user" | awk -F: '{print $2}')if [[ $mima == "!!" || -z "$mima" ]]thenecho "空密码需要设置密码"echo 123 | passwd --stdin $userelseecho "用户有密码"fi
elseecho "$user用户不存在,需创建"useradd $userecho "并创建密码"echo 123 | passwd --stdin $user
fi
done[root@test1 opt]# vim users.txt
[root@test1 opt]# useradd xy111
[root@test1 opt]# sh test41.sh
xy108
用户存在
用户有密码
xy110用户不存在,需创建
并创建密码
更改用户 xy110 的密码 。
passwd:所有的身份验证令牌已经成功更新。
xy111
用户存在
空密码需要设置密码
更改用户 xy111 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@test1 opt]# vim test41.sh
[root@test1 opt]# sh test41.sh
xy108
用户存在
用户有密码
xy110
用户存在
用户有密码
xy111
用户存在
用户有密码

作业2:使用循环语句,将一个0-255的十进制转换8位的二进制数;

[root@test1 opt]# vim test42.shread -p "输入0-255范围内的数:" a
c=
for ((i=1;i<=8;i++))
dob=$(($a%2))c=$b$ca=$((a/2))
done
echo "$c"[root@test1 opt]# sh test42.sh
输入0-255范围内的数:67
01000011
[root@test1 opt]# sh test42.sh
输入0-255范围内的数:255
11111111
[root@test1 opt]# sh test42.sh
输入0-255范围内的数:1
00000001

并创建密码
更改用户 xy110 的密码 。
passwd:所有的身份验证令牌已经成功更新。
xy111
用户存在
空密码需要设置密码
更改用户 xy111 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@test1 opt]# vim test41.sh
[root@test1 opt]# sh test41.sh
xy108
用户存在
用户有密码
xy110
用户存在
用户有密码
xy111
用户存在
用户有密码

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com