32、循环语句while+until

一、循环控制语句

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

1、进入调试模式
在脚本里第一行写入set -x
bash -x 脚本

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、continue

[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
#开启调试模式
在脚本里第一行写入set -x
bash -x 脚本

进入调试模式
set +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
用户存在
用户有密码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实时数仓Hologres V2.2发布,Serverless Computing降本20%

Highlight 新发布Serverless Computing&#xff0c;提升大任务稳定性&#xff0c;同时可降低20%计算成本 引擎性能优化&#xff0c;TPC-H 1TB测试相对V1.X 提升100% 实时湖仓加速架构升级&#xff0c;支持Paimon&#xff0c;直读ORC、Parquet数据性能提升5倍以上 新增实例监…

LLM中表格处理与多模态表格理解

文档处理中不可避免的遇到表格&#xff0c;关于表格的处理问题&#xff0c;整理如下&#xff0c;供各位参考。 问题描述 RAG中&#xff0c;对上传文档完成版式处理后进行切片&#xff0c;切片前如果识别文档元素是表格&#xff0c;那么则需要对表格进行处理。一般而言&#x…

JupyterLab使用指南(二):JupyterLab基础

第2章 JupyterLab基础 2.1 JupyterLab界面介绍 JupyterLab的用户界面非常直观和灵活。它包括文件浏览器、工作区、多标签页、命令面板和侧边栏等功能。以下是各个部分的详细介绍&#xff1a; 2.1.1 文件浏览器 文件浏览器位于界面左侧&#xff0c;用于导航和管理文件。你可…

计算机网络:网络层 - 虚拟专用网 VPN 网络地址转换 NAT

计算机网络&#xff1a;网络层 - 虚拟专用网 VPN & 网络地址转换 NAT 专用地址与全球地址虚拟专用网 VPN隧道技术 网络地址转换 NAT网络地址与端口号转换 NAPT 专用地址与全球地址 考虑到 IP 地址的紧缺&#xff0c;以及某些主机只需要和本机构内部的其他主机进行通信&…

cbsd创建ubuntu jail 时下载系统慢的问题解决

下载时速度慢 使用cbsd创建ubuntu jail的时候 cbsd jconstruct-tui 提示&#xff1a; no base dir in: /usr/jails/basejail/base_amd64_amd64_jammy Select base sources:0 .. CANCELa .. build b .. extract c .. pkg d .. repo 选了pkg没找到 fetch: https://pkg.convec…

【减法网络】Minusformer:通过逐步学习残差来改进时间序列预测

摘要 本文发现泛在时间序列(TS)预测模型容易出现严重的过拟合。为了解决这个问题&#xff0c;我们采用了一种去冗余的方法来逐步恢复TS的真实值。具体来说&#xff0c;我们引入了一种双流和减法机制&#xff0c;这是一种深度Boosting集成学习方法。通过将信息聚合机制从加法转…

【第16章】Vue实战篇之跨域解决

文章目录 前言一、浏览器跨域二、配置代理1.公共请求2.代理配置 总结 前言 前后端项目分离衍生出浏览器跨域问题&#xff0c;开发之前我们通过配置代理解决这个问题。 一、浏览器跨域 浏览器的跨域问题主要是由于浏览器的同源策略导致的。同源策略是浏览器的一个安全功能&…

OpenGL3.3_C++_Windows(11)

git submodule项目子模块 Git Submodule &#xff08;子模块的代码并不直接存储在父仓库中&#xff0c;而是通过一个指针来维护&#xff09;克隆含有子模块的仓库时&#xff0c;使用git管理Git Clone &#xff08;复制一份完整的Git仓库到本地&#xff09;若仓库包含子模块&am…

【设计模式-12】代理模式的代码实现及使用场景

&emsp&#xff1b;代理模式是一种应用很广发的结构性设计模式&#xff0c;它的设计初衷就是通过引入新的代理对象&#xff0c;在客户端和目标对象之间起到中介的作用&#xff0c;从而实现控制客户端对目标对象的访问&#xff0c;比如增强或者阉割某些能力。 1. 概述 代理模…

《优化接口设计的思路》系列:第1篇—什么是接口缓存

一、缓存的定义&#xff1a; 缓存是一种存储数据的技术&#xff0c;用于提高数据访问的速度和效率。缓存通常存储在内存中&#xff0c;因为内存访问速度远快于磁盘和网络。数据接口通常会使用缓存技术&#xff0c;以降低对后端数据存储和处理的压力&#xff0c;提高系统性能。…

⭐ ▶《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch3 贝尔曼最优公式 【压缩映射定理】

PPT 截取必要信息。 课程网站做习题。总体 MOOC 过一遍 1、视频 学堂在线 习题 2、过 电子书&#xff0c;补充 【下载&#xff1a;本章 PDF 电子书 GitHub 界面链接】 [又看了一遍视频] 3、总体 MOOC 过一遍 习题 学堂在线 课程页面链接 中国大学MOOC 课程页面链接 B 站 视频链…

c++qt合并两张灰度图像

需求&#xff1a;将两张尺寸相同的灰度图像进行合并&#xff0c;合并后的图像&#xff0c;每个像素点灰度值为两张原图对应像素点灰度值之和。若超过255&#xff0c;则最大为255。 方法一&#xff1a; 将图像读取为cv::Mat&#xff0c;再调用opencv的cv::add方法&#xff0c;进…

【ai】初识pytorch

初识PyTorch 大神的例子运行: 【ai】openai-quickstart 配置pycharm工程 简单例子初识一下Pytorch 好像直接点击下载比较慢? 大神的代码 在这个例子中,首先定义一个线性模型,该模型有一个输入特征和一个输出特征。然后定义一个损失函数和一个优化器,接着生成一些简单的线性…

Golang内存模型与分配机制

简述 mheap为堆&#xff0c;堆和进程是一对一的&#xff1b;mcentral&#xff08;小mheadp&#xff09;&#xff0c;mcahe&#xff08;GMP的P私有&#xff09;&#xff0c;分配内存顺序由后向前。 在解决这个问题&#xff0c;Golang 在堆 mheap 之上&#xff0c;依次细化粒度&a…

前端构建工具用得好,构建速度提升 10 倍

今天来盘点一下前端构建工具。 Turbopack Turbopack&#xff0c;由Vercel开源&#xff0c;是下一代高性能的JavaScript应用构建工具&#xff0c;目前用于 Next.js 中。Turbopack旨在通过革新JavaScript应用的打包流程来显著提升应用性能&#xff0c;它专注于缩短加载时间&…

Python工具箱系列(五十三)

​​水印 水印是一种常见的图片处理需求。当既需要展示&#xff0c;又需要保护知识产权时&#xff0c;就需要使用文字或者图片来打水印。下面的代码展示了文字水印与图片水印的过程。 ​--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown from pat…

游戏找不到steam_api64.dll无法继续执行代码的解决方法

在电脑使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“steam_api64.dll丢失”。那么&#xff0c;steam_api64.dll到底是干嘛的&#xff1f;为什么会丢失&#xff1f;对电脑有什么具体影响&#xff1f;如何解决这个问题&#xff1f;本文将为您详细…

Python基础教程(九):Lambda 函数

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

vivado NODE、PACKAGE_PIN

节点是Xilinx部件上用于路由连接或网络的设备对象。它是一个 WIRE集合&#xff0c;跨越多个瓦片&#xff0c;物理和电气 连接在一起。节点可以连接到单个SITE_&#xff0c; 而是简单地将NETs携带进、携带出或携带穿过站点。节点可以连接到 任何数量的PIP&#xff0c;并且也可以…

基于QT5.12.7的VTK8.2下的VS2015 X64源码编译以及测试

有一段时间没更新博客了&#xff0c;最近在考虑使用VTK作为软件的后处理显示&#xff0c;相比于OSG&#xff0c;VTK在后处理上集成了很多优秀的算法&#xff0c;使用起来比较方便&#xff0c;而且后处理一般不需要太多的交互&#xff0c;所以VTK是一个不错的选择。 之前对VTK了…