Linux之shell循环
华子目录
- for循环
- 带列表的for循环
- 格式
- 分析
- 示例
- shell允许用户指定for语句的步长,格式如下
- 示例
- 不带列表的for循环
- 示例
- 基于C语言风格的for循环
- 格式
- 示例
- 注意
- while循环
- 格式
- 示例
- until循环
- 作用
- 格式
- 示例
- 循环控制
- break
- continue
- 详细语法
- 示例
- 循环嵌套
- 示例
for循环
- for循环是最简单,也是最常用的循环语句。与其他的程序设计语言一样,for循环都是初学者在学习循环结构时的入门课程。for循环通常用于遍历整个对象或者数字列表。按照循环条件的不同,for循环语句可以分为带列表的for循环、不带列表的for循环以及类C风格的for循环。本节将介绍这3种不同的for循环结构。
带列表的for循环
格式
for 循环变量 in {list}
dostatement1statement2...
done
分析
- variable称为循环变量
- list是一个列表,可以是一系列的数字或者字符串,元素之间使用空格隔开
- do和done之间的所有的语句称为循环体,即循环结构中重复执行的语句
- 执行时,Shell会将in关键字后面的list列表的第1个元素的值赋给变量variable,然后执行循环体,当循环体中的语句执行完毕之后剩余以此类推,当list列表中的所有的元素都被访问后,for循环结构终止,程序将继续执行done语句后面的其他的语句
示例
[root@server ~]# vim for1.sh
#!/bin/bash
for ip in 192.168.80.129 192.168.80.130
doecho $ip
done[root@server ~]# bash for1.sh
192.168.80.129
192.168.80.130
[root@server ~]# vim for2.sh
#!/bin/bash
for ip in 192.168.80.{120..140..1} # 使用{start..end..step} 进行扩展
doecho $ip
done[root@server ~]# bash for2.sh
192.168.80.120
192.168.80.121
192.168.80.122
192.168.80.123
192.168.80.124
192.168.80.125
192.168.80.126
192.168.80.127
192.168.80.128
192.168.80.129
192.168.80.130
192.168.80.131
192.168.80.132
192.168.80.133
192.168.80.134
192.168.80.135
192.168.80.136
192.168.80.137
192.168.80.138
192.168.80.139
192.168.80.140
- 获取指定目录下的所有目录的文件名
[root@server ~]# vim for3.sh
#!/bin/bash
for file in $(ls -F / | grep "/$")
doecho $file | cut -d "/" -f1
done# ls -F :用于将目录内的文件按照文件类型进行归类显示,会在不同类别的文件名尾部增加不同的标识符,目录以/结尾、链接文件以@结尾、可执行文件以*结尾、普通文件无符号
# grep "/$" :表示过滤以/结尾的行[root@server ~]# bash for3.sh
afs
boot
dev
etc
home
media
mnt
opt
proc
root
run
srv
sys
tmp
usr
var
shell允许用户指定for语句的步长,格式如下
for variable in {start..end..step}
dostatement1statement2...
done
示例
- 例3:计算1+2+3+4+5+……+100和
[root@server ~]# bash for4.sh
#!/bin/bash
sum=0
for i in {1..100..1}
do((sum=$sum+$i))
done
echo "sum=$sum"[root@server ~]# bash for4.sh
sum=5050
# 上例修改
[root@server ~]# bash for4.sh
#!/bin/bash
sum=0
for i in $(seq 100)
do((sum=$sum+$i))
done
echo "sum=$sum"[root@server ~]# bash for4.sh
sum=5050
不带列表的for循环
- 原则:for不提供循环列表,shell将从命令行(相当于以位置参数的形式传入循环列表)获取循环列表数据及条件,格式:
for variable
dostatement1statement2...
done
- 由于系统变量$@可以获取所有位置参数,以上的语法等价于:
for variable in $@或$*
dostatement1statement2...
done
示例
[root@server ~]# vim for5.sh
#!/bin/bash
for arg
do echo $arg
done [root@server ~]# bash for5.sh {1..10..2}
1
3
5
7
9
基于C语言风格的for循环
格式
for ((初始化;条件表达式;步长)) # 注意:2个圆括号
dostatement1statement2...
done
示例
- 面试题,批量创建账户
[root@server ~]# vim for6.sh
#!/bin/bash
for((i=1;i<=10;i++))
doif ! id -u temp$i &> /dev/nullthenuseradd temp$iecho "123456" | passwd --stdin temp$i &> /dev/nullelseecho "temp$i 账户已存在"fi
done [root@server ~]# bash for6.sh
[root@server ~]# id temp1
用户id=1001(temp1) 组id=1001(temp1) 组=1001(temp1)
注意
i++表示置后自增,++i置前自增
[root@server ~]# x=1
[root@server ~]# y=2
[root@server ~]# echo $((x++))
1
[root@server ~]# echo $x
2
[root@server ~]# echo $((++y))
3
[root@server ~]# echo $y
3
while循环
格式
while expression
dostatement1statement1……
done
- 上例语法中,expression表示条件表达式,循环必须满足该表达式,否则循环结束,可以是任何符合语法的shell命令,但推荐书写测试表达式
示例
- while循环读取文件
# 法1 ,采用exec读取文件
[root@server ~]# vim file1.txt
data1
data2
data3
data4
data5
[root@server ~]# vim while1.sh
#!/bin/bash
exec < file1.txt
while read a
doecho $a
done
# exec < file1.txt 将file.txt文件内容读入到标准输入中
# read a 表示从标准输入中按照行读取内容到变量a[root@server ~]# bash while1.sh
data1
data2
data3
data4
data5
# 法2:使用cat读取文件,通过管道符进入while循环处理
cat 文件名 | while read line
do statement1statement1……
done
#法3 : 在while循环尾部使用输入重定向指定输入数据
while read line
dostatement1statement1……
done < 文件名
- 猜商品价格,通过变量RANDOM获取随机整数并控制20以内,提示用户猜测商品价格,猜测时需要记录次数,猜中后退出程序
[root@server ~]# vim while2.sh
#!/bin/bash
price=$[ $RANDOM%20 ]
count=0
while true
doread -p "请输入[0-20]间的商品价格: " INTlet count++if(($INT==$price))thenecho "恭喜,你猜中!"echo "你使用了$count次机会"exit 0elif (($INT>$price))thenecho "你输入的商品价格高了!"elseecho "你输入的商品价格低了!"fi
done[root@server ~]# bash while2.sh
请输入[0-20]间的商品价格:10
你输入的商品价格高了
请输入[0-20]间的商品价格:5
你输入的商品价格高了
请输入[0-20]间的商品价格:3
你输入的商品价格高了
请输入[0-20]间的商品价格:2
你输入的商品价格高了
请输入[0-20]间的商品价格:1
你输入的商品价格高了
请输入[0-20]间的商品价格:0
恭喜,你猜中了
你使用了6次机会
until循环
作用
- until循环不断地重复执行循环中的语句,直至某个条件成立,与while循环的执行条件相反
格式
until expreession
dostatement1statement2……
done
示例
[root@server ~]# vim while3.sh
# while3.sh 的改写
#!/bin/bash
i=1
until [ $i -gt 10 ] # i>10 ,注意,条件要相反
doif id -u temp$i &> /dev/nullthenuserdel -r test$ielseecho "test$i 账户已删除"filet i++
done
循环控制
break
break: 是立即跳出某个循环结构。break语句可以用在for、while或者until等循环语句的循环体中
continue
continue: 作用不是退出循环体。而是跳过当前循环体中该语句后面的语句,重新从循环语句开始的位置执行
详细语法




示例
- 判断素数
[root@server ~]# vim for7.sh
#!/bin/bash
read -p "请输入一个正整数: " prime
if ((prime<2))
thenecho "数据错误,请输入大于等于2的正整数!"
else for ((i=2;i<prime;i++))do if ((prime%i==0))then echo "平数"breakfi done if ((i==prime))then echo "素数"fi
fi
- 计算100到150之间不能被3整除的数,输出时一行显示5个
[root@server ~]# bash for8.sh
#!/bin/bash
count=0
for((i=100;i<150;i++))
doif ((i%3==0))thencontinuefiecho -ne "$i\t"((count++))if ((count%5==0))thenechofi
done
echo
循环嵌套
示例
- 九九乘法表
[root@server ~]# bash for9.sh
#!/bin/bash
for i in $(seq 9)
dofor j in $(seq 9)do((j<=i)) && echo -ne "$i*$j=`echo $((i*j))` \t"doneecho
done
- 打印三角形
[root@server ~]# bash for10.sh
#!/bin/bash
read -p "请输入图形行数:" h
for ((i=0;i<h;i++)) # 循环处理h行
dofor ((j=0;j<h-i;j++)) # 每行打印一些空格doecho -n " "donefor ((k=0;k<2*i+1;k++)) # 每行打印一些星号doecho -n "*"doneecho # 每行最后打印一个\n
done
- 打印数字三角形
[root@server ~]# bash for11.sh
#!/bin/bash
for ((i=1;i<10;i++))
dofor ((j=1;j<=10-i;j++))doecho -n " "donefor ((k=1;k<=i;k++))doecho -n "$i"doneecho
done
相关文章:
Linux之shell循环
华子目录 for循环带列表的for循环格式分析示例shell允许用户指定for语句的步长,格式如下示例 不带列表的for循环示例 基于C语言风格的for循环格式示例注意 while循环格式示例 until循环作用格式示例 循环控制breakcontinue详细语法示例 循环嵌套示例 for循环 for循…...
Python入门教程(一)|基本语法概述
目录 1. 注释 2. 变量和数据类型 3. 控制流 4. 函数 5. 类与对象 6. 异常处理 7. 模块和包 8. 文件操作 1. 注释 在Python中,单行注释以#开始,多行注释使用三个引号 """ 或 。 # 这是单行注释""" 这是 多行 注释…...
Android Studio入门——页面跳转
1.工程目录 2.MainActivity package com.example.demo01;import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCo…...
肝了三天,完成了AIGC工具网站大全,建议收藏再看
说是肝了三天,其实远远不止,前前后后,从资料搜集到最后整理成文,有近一个月了,大家看在整理不易的份上,给点个赞吧,不要光顾着收藏呀! 国内网站 AIGC 导航 https://www.aigc.cn 网…...
算法练习:前缀和
目录 1. 一维前缀和2. 二维前缀和3. 寻找数组中心下标4. 除自身以外数组的乘积5. !和为k的子数字6. !和可被k整除的子数组7. !连续数组8. 矩阵区域和 1. 一维前缀和 题目信息: 题目链接: 一维前缀和思路:求前缀和数组,sum dp[r] …...
Kafka MQ 生产者
Kafka MQ 生产者 生产者概览 尽管生产者 API 使用起来很简单,但消息的发送过程还是有点复杂的。图 3-1 展示了向 Kafka 发送消息的主要步骤。 我们从创建一个 ProducerRecord 对象开始,ProducerRecord 对象需要包含目标主题和要发送的内容。我们还可以…...
SQLiteC/C++接口详细介绍之sqlite3类(十)
返回目录:SQLite—免费开源数据库系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(九) 下一篇:SQLiteC/C接口详细介绍之sqlite3类(十一) 30.sqlite3_enable_load_extension&#x…...
Vue中nextTick一文详解
什么是 nextTick? 在 Vue 中,当我们修改数据时,Vue 会自动更新视图。但是,由于 JavaScript 的事件循环机制,我们无法立即得知视图更新完成的时机。这时候,我们就需要使用 nextTick 来获取视图更新完成后的…...
爱奇艺 CTR 场景下的 GPU 推理性能优化
01 背景介绍 GPU 目前大量应用在了爱奇艺深度学习平台上。GPU 拥有成百上千个处理核心,能够并行的执行大量指令,非常适合用来做深度学习相关的计算。在 CV(计算机视觉),NLP(自然语言处理)的模型…...
详解MySql索引
目录 一 、概念 二、使用场景 三、索引使用 四、索引存在问题 五、命中索引问题 六、索引执行原理 一 、概念 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。暂时可以理解成C语言的指针,文章后面详解 二、使用场景 数据量较大,且…...
struct 和 union 的区别?
struct和union的分对应点总结 存储方式: struct:struct中的每个成员都拥有独立的内存空间。一个struct变量的总长度是其所有成员的长度之和,且通常会根据编译器的内存对齐规则进行适当调整。union:union中的所有成员共享同一段内…...
Linux - 安装 Jenkins(详细教程)
目录 前言一、简介二、安装前准备三、下载与安装四、配置镜像地址五、启动与关闭六、常用插件的安装 前言 虽然说网上有很多关于 Jenkins 安装的教程,但是大部分都不够详细,或者是需要搭配 docker 或者 k8s 等进行安装,对于新手小白而已&…...
【JAVA】JAVA方法的学习和创造
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| 💫个人格言:“没有罗马,那就自己创造罗马~” 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不…...
Rust写一个wasm入门并在rspack和vite项目中使用(一)
rust打包wasm文档 文档地址 安装cargo-generate cargo install cargo-generate 安装过程中有问题的话手动安装cargo-generate下载地址 根据自己的系统下载压缩包,然后解压到用户/.cargo/bind目录下,将解压后的文件放到该目录下即可。 创建wasm项目 …...
HTTP和HTTPS的区别,HTTPS加密原理是?
HTTP和HTTPS都是网络传输协议,主要用于浏览器和服务器之间的数据传输,但它们在数据传输的安全性、加密方式、端口等方面有所不同。 数据传输的安全性:HTTP是明文传输,数据不加密,容易被黑客窃听、篡改或者伪造&#x…...
基于Spring Boot+Vue的校园二手交易平台
目录 一、 绪论1.1 开发背景1.2 系统开发平台1.3 系统开发环境 二、需求分析2.1 问题分析2.2 系统可行性分析2.2.1 技术可行性2.2.2 操作可行性 2.3 系统需求分析2.3.1 学生功能需求2.3.2 管理员功能需求2.3.3游客功能需求 三、系统设计3.1 功能结构图3.2 E-R模型3.3 数据库设计…...
什么是软件开发?软件开发阶段划分是什么?并以LabVIEW为例进行说明
软件开发是一种创建、设计、编码、测试和维护应用程序、框架或其他软件组件的过程。它涉及从理解需求到设计、实现、测试、部署和最终维护的全过程。软件开发可以用来创建新的软件应用、系统软件、游戏、或开发网络应用等。 软件开发过程通常可以分为以下几个阶段:…...
PTAL1-006 连续因子
c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…...
【Java】容器|Set、List、Map及常用API
目录 一、概述 二、List 1、List的常用API 2、ArrayList 3、List遍历 三、Set 1、Set的常用方法: 2、HashSet 3、遍历集合: 四、Map 1、Map常用API 2、HashMap 3、遍历Map 五、迭代器 一、概述 在Java中所有的容器都属于Collection接口下的内容 1…...
Navicat 面试题及答案整理,最新面试题
Navicat 在数据库管理中的主要用途有哪些? Navicat 是一款数据库管理工具,其主要用途包括: 1、多数据库支持: Navicat 支持多种数据库连接,包括 MySQL、Oracle、PostgreSQL、SQLite、SQL Server 等,方便用…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化
是不是受够了安装了oracle database之后sqlplus的简陋,无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话,配置.bahs_profile后也能解决上下翻页这些,但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可,…...
jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...
