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.sh

for 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.sh

for i in {1..9}
do
 for j in {1..9}
  do
  if [[ $j -le $i ]]
  then
  echo -n $(($i*$j))   ##漂亮输出echo -ne "$i*$j=$(($i*$j))\t" 
  fi
  done
 echo
done



[root@test1 opt]# sh test31.sh
1
24
369
481216
510152025
61218243036
7142128354249
816243240485664
91827364554637281


[root@test1 opt]# vim test32.sh



for ((i=5;i>=1;i--))
do
for ((j=1;j<=i;j++))
  do
  echo -ne "$i*$j=$(($i*$j))\t" 
  done
 echo
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}
do
 for j in {1..5}
 do
 if [ $j -eq 3 ]
 then
  break 2  #跳出2层循环
#循环控制,continue'和break默认值就是1
  fi
 echo $j
done
#echo $i
done
~     

1.3、ontinue

[root@test1 opt]# vim test33.sh

for i in {1..3}
do
 for j in {1..5}
 do
 if [ $j -eq 3 ]
 then
  continue 
#循环控制,continue'和break默认值就是1
  fi
 echo $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.sh



for i in {1..3}
do
 for j in {1..5}
 do
 if [ $j -eq 3 ]
 then
  continue 2
#循环控制,continue'和break默认值就是1
  fi
 echo $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.sh

i=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.sh

i=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.sh

i=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.sh

i=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.sh

i=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.sh



i=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.sh

for 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.sh





for 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

在这里插入图片描述

{

循环体

}&
#把整个循环体的代码看作一个整个内容,相当于并行,&循环成立的内容放入后台执行
done

wait
#计算器,实现整数的+,-,*,/,%
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++))
do
 read -p "输入密码" a
 if [[ $a == "123456" ]]
 then
 echo "密码输入正确"
 break
 elif [[ $i -eq 3 ]]
 then
 echo "输入3次错误,密码已经被锁定"
 else
 echo "密码输入错误"
 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 ]]
 then
 echo "用户存在"
mima=$(cat /etc/shadow | grep "$user" | awk -F: '{print $2}')
 if [[ $mima == "!!" || -z "$mima" ]]
 then
  echo "空密码需要设置密码"
  echo 123 | passwd --stdin $user
 else
 echo "用户有密码"
 fi
else
  echo "$user用户不存在,需创建"
  useradd $user
  echo "并创建密码"
  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.sh



read -p "输入0-255范围内的数:" a
c=
for ((i=1;i<=8;i++))
do
 b=$(($a%2))
 c=$b$c
 a=$((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
用户存在
用户有密码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/717122.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Django的博客系统之增加手机验证码登录(九)

需求文档 概述 实现基于Redis和第三方短信服务商的短信验证码登录功能。用户可以通过手机号码获取验证码&#xff0c;并使用验证码进行登录。 需求细节 用户请求验证码 用户在登录页面输入手机号码并请求获取验证码。系统生成验证码并将其存储在Redis中&#xff0c;同时通过…

设备保养计划不再是纸上谈兵,智能系统让执行更到位!

在物业管理的日常工作中&#xff0c;我们常常听到“设备保养台账”“设备保养计划”“设备保养记录”等等这些词&#xff0c;但你是否真正了解它们的含义&#xff1f;是否知道一个完善的设备保养计划、记录、台账对于物业运营的重要性&#xff1f;今天&#xff0c;我们就来深入…

一个开源的快速准确地将 PDF 转换为 markdown工具

大家好&#xff0c;今天给大家分享的是一个开源的快速准确地将 PDF 转换为 markdown工具。 Marker是一款功能强大的PDF转换工具&#xff0c;它能够将PDF文件快速、准确地转换为Markdown格式。这款工具特别适合处理书籍和科学论文&#xff0c;支持所有语言的转换&#xff0c;并…

【AI绘画】文心一格

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

Spring Cloud全家桶(上)【Nacos、OpenFeign、LoadBalancer、GateWay、金丝雀灰色发布】

0.零基础入门微服务实战课 1.微服务和 Spring Cloud1.1 什么是微服务&#xff1f;1.2 什么是 Spring Cloud&#xff1f;1.3 微服务 VS Spring Cloud 2.为什么要学微服务&#xff1f;3.Spring Cloud 组件介绍1.什么是 Nacos?1.1 Nacos 功能1.1.1 配置中心1.1.2 注册中心 1.2 Na…

openlayers 使用WMTS和XYZ加载天地图切片服务

openlayers 使用WMTS和XYZ加载天地图切片服务 本篇介绍一下使用openlayers加载天地图切片&#xff0c;两种方法&#xff1a; 使用WMTS使用XYZ 1 需求 openlayers加载天地图 2 分析 主要是不同类型source的使用 WMTS&#xff08;Web Map Tile Service&#xff09; 是 OGC…

《地下城与勇士》新手攻略,开荒必备!云手机多开教程!

《地下城与勇士》&#xff08;DNF&#xff09;是一款广受欢迎的多人在线动作角色扮演游戏。玩家将在游戏中扮演不同职业的角色&#xff0c;通过打怪、做任务、PK等方式不断提升自己&#xff0c;探索广阔的阿拉德大陆。游戏中设有丰富的副本、装备、技能系统&#xff0c;玩家可以…

ESP32-S3芯片的Strapping管脚功能描述

文章目录 一、Strapping管脚是什么&#xff1f;二、ESP32-S3芯片的Strapping管脚总体描述三、ESP32-S3芯片的Strapping管脚具体功能描述1、芯片启动模式控制2、VDD_SPI 电压控制3、ROM 日志打印控制4、JTAG 信号源控制 一、Strapping管脚是什么&#xff1f; 芯片每次上电或复位…

销售如何提高回复客户消息的速度?

在如今竞争激烈的商业环境中&#xff0c;能够快速回复客户消息是维护客户关系和提升用户体验的重要一环。尤其是对于很多企业或是销售客服人员来说&#xff0c;及时回复客户的咨询和反馈&#xff0c;能够有效增强客户的粘性和满意度。 那么怎样才能快速回复客户消息呢&#xf…

sklearn 基础教程

scikit-learn&#xff08;简称sklearn&#xff09;是一个开源的机器学习库&#xff0c;它提供了简单和有效的数据分析和数据挖掘工具。sklearn是Python语言中最重要的机器学习库之一&#xff0c;广泛用于统计学习和数据分析。 以下是scikit-learn的基础教程&#xff0c;帮助您开…

洗地机怎么选?洗地机哪个品牌比较好?四款实力超牛的单品推荐

随着生活节奏的加快&#xff0c;家庭清洁已经成为许多人面临的一大挑战。传统的扫地和拖地方式不仅耗时耗力&#xff0c;还难以彻底清洁每一个角落。家用洗地机的出现&#xff0c;为人们的家庭提供了一个全新的清洁解决方案。然而&#xff0c;在选择合适的洗地机时&#xff0c;…

示例:WPF中DataGrid简单设置合并列头

一、目的&#xff1a;应用DataGridTemplateColumn列模板&#xff0c;去拆分列头和单元格布局的方式设置列头合并样式 二、实现 效果如下 三、环境 VS2022 四、示例 应用DataGridTemplateColumn自定义列头信息和单元格信息 <DataGrid AutoGenerateColumns"False"…

一分钱不花!本地部署Google最强开源AI大模型Gemma教程

谷歌发布了轻量级开源系列模型Gemma&#xff0c;其性能强大&#xff0c;可与主流开源模型竞争。通过Ollama可轻松部署Gemma模型&#xff0c;并使用JANAI美化UI界面。显卡在AIGC应用中至关重要&#xff0c;推荐选择性能强、显存大的NVIDIA系列显卡。 半个月前&#xff0c;谷歌搞…

echarts引入百度地图vue3(大屏项目中缩放点偏移到左上角,解决代码在最后)

实际开发中的问题&#xff0c;遇到了大屏做了自适应&#xff0c;为非标准文档流之后&#xff0c;在缩放时不是以鼠标当前位置缩放的&#xff0c;而是偏移到左上角。 向百度地图提了工单也没解决&#xff0c;同一套适应方案用cesium地图时缩放没问题&#xff1a; 先看看效果&am…

数字人全拆解:如何构建一个基于大模型的实时对话3D数字人?

简单地说&#xff0c;数字人就是在数字世界的“人”。当前语境下我们谈到的数字人通常指的是借助AI技术驱动的虚拟世界人物&#xff0c;具备与真实人类相似甚至接近的外形、感知、交互与行为能力。 AI技术在智能数字人的应用中举足轻重&#xff0c;特别是随着大模型能力的涌现…

死锁预防之银行家算法

死锁预防之银行家算法 第一章 概述 Dijkstra提出了一种能够避免死锁的调度算法,称为银行家算法。 它的模型基于一个小城镇的银行家,他向一群客户分别承诺了一定的贷款额度,每个客户都有一个贷款额度,银行家知道不可能所有客户同时都需要最大贷款额,所以他只保留一定单位…

工业上常见的智能测量设备

工业智能测量仪包括测径仪、测宽仪、测厚仪和直线度测量仪等&#xff0c;主要用于自动化生产线上的高精度尺寸测量。这些设备通常采用光电、激光、工业相机等技术进行非接触式测量&#xff0c;以确保高效率和准确性。测径仪用于测量圆形物体的直径&#xff0c;测宽仪用于测量板…

基于springboot+vue的供应商管理系统

一、系统架构 前端&#xff1a;vue2 | element-ui 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. 员工注册 02. 登录 03. 管理员-首页 04. 管理员-个人中心-修改密码 05. …

Windows电脑部署Jellyfin服务端并进行远程访问配置详细教程

文章目录 前言1. Jellyfin服务网站搭建1.1 Jellyfin下载和安装1.2 Jellyfin网页测试 2.本地网页发布2.1 cpolar的安装和注册2.2 Cpolar云端设置2.3 Cpolar本地设置 3.公网访问测试4. 结语 前言 本文主要分享如何使用Windows电脑本地部署Jellyfin影音服务并结合cpolar内网穿透工…

ECharts词云图(案例一)+配置项详解

ECharts词云图&#xff08;案例一&#xff09;配置项详解 ECharts 是一款由百度团队开发的基于 JavaScript 的开源可视化图表库&#xff0c;它提供了丰富的图表类型&#xff0c;包括常见的折线图、柱状图、饼图等&#xff0c;以及一些较为特殊的图表&#xff0c;如词云图。从版…