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;用于导航和管理文件。你可…

白酒起源传说(三)——仪狄造酒说

在古代文献中&#xff0c;仪狄被记载为酿酒的始祖&#xff0c;这一创造更是与传说中的帝王夏禹相联系。据《吕氏春秋》记载&#xff1a;“仪狄作酒”。而在汉代刘向编纂的《战国策》中&#xff0c;也有着关于仪狄酿酒的故事。在这些古典文字里&#xff0c;仪狄被描述为一个致力…

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

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

【镜像制作】node.js+pm2的latest版镜像制作

文章目录 简介dockerfile代码 简介 本司的一些nodejs环境基本都运行在pm2的环境下&#xff0c;pm2是一个node环境下的多进程管理工具&#xff0c;通过pm2可以提升不少性能&#xff0c;管理起来也比较方便。在制作nodejspm2镜像时&#xff0c;建议指定版本进行安装&#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集成学习方法。通过将信息聚合机制从加法转…

Jenkins简要说明

Jenkins 是一个开源的持续集成和持续部署&#xff08;CI/CD&#xff09;工具&#xff0c;广泛用于自动化软件开发过程中的构建、测试和部署等任务。它是基于Java开发的&#xff0c;因此可以在任何支持Java的平台上运行&#xff0c;并且能够与各种操作系统、开发工具和插件无缝集…

【第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. 概述 代理模…

数据库-数据定义和操纵-DML语言的使用

为表的所有字段插入数据&#xff1a; INSERT INTO 表名 (字段名) VALUES (内容); 更新表中指定的内容: update语句三要素&#xff1a; 需要更新的表&#xff08;table&#xff09;名&#xff1b; 需要更新的字段&#xff08;column&#xff09;名和它的新内容&#xff08;valu…

JavaScript 中的 AbortController

AbortController 接口是 JavaScript 中 Fetch API 的一部分&#xff0c;引入它是为了处理和控制中止 fetch 请求的信号。这在需要取消正在进行的网络请求时特别有用&#xff0c;例如用户发起的动作取消&#xff0c;通过避免不必要的请求来提高性能&#xff0c;或优雅地处理超时…

揭秘创业加盟:豫腾助力,发掘商机,共赢未来

在我们生活的这个充满活力与机遇的世界里&#xff0c;商业活动如繁星点点&#xff0c;照亮着每个人的创业梦想。 在这个过程中&#xff0c;创业加盟作为一种独特且吸引人的模式&#xff0c;逐渐受到广大创业者的关注。 本文将深入解析创业加盟的精髓&#xff0c;以及如何在其…

【gdb使用】

gdb使用简介 1 gdb安装与调试 1.1 gdb安装 sudo apt-get install gdb1.2 gdb 使用 1.2.1 运行代码 若要使用gdb调试代码&#xff0c;在代码编译时需要添加-g选项。 1&#xff09;调试程序&#xff1a;gdb bin文件名 2&#xff09;启动调试&#xff1a;run(r) ​ 如果调…

《优化接口设计的思路》系列:第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 好像直接点击下载比较慢? 大神的代码 在这个例子中,首先定义一个线性模型,该模型有一个输入特征和一个输出特征。然后定义一个损失函数和一个优化器,接着生成一些简单的线性…