14.bash shell中的for/while/until循环
文章目录
- `shell`循环语句`for`命令
 - **读取列表中的值**
 - **读取列表中的复杂值**
 - **从变量读取列表**
 - 迭代数组
 - **从命令读取值**
 - **用通配符读取目录**
 - `C`语言风格的`shell for`循环
 
- `shell`循环`while`命令
 - `shell` 循环的`until`命令
 - `shell`循环跳出的`break/continue`命令
 - break命令
 - continue命令
 - trick
 
欢迎访问个人网络日志🌹🌹知行空间🌹🌹
shell循环语句for命令
 
bash shell中 for 命令的基本格式:
for var in list
docommands
done
 
list参数中,需要提供迭代中要用到的一系列值。指定列表中值的方法:
读取列表中的值
#!/bin/bash
for v in a b c; doecho "The Text is $v"
done# The Text is a
# The Text is b
# The Text is c
 
读取列表中的复杂值
当列表中包含单引号时会导致迭代出错:
#!/bin/bash
for v in I can't argee that's right ; doecho "The word is $v"
done# The word is I
# The word is cant argee thats
# The word is right 
可以看到因为受单引号的影响并没有按word by word输出。解决办法有两个,
- 对单引号进行转义
 - 使用双引号包围
 
#!/bin/bash
for v in I can\'t argee "that's" right ; doecho "The word is $v"
done# The word is I
# The word is can't
# The word is argee
# The word is that's
# The word is right 
for 命令用空格来划分列表中的每个值。如果在单独的数据值中有空格,就必须用双引号将这些值圈起来。
#!/bin/bash
for v in a "b c" ; doecho "The word is $v"
done# The word is a
# The word is b c
 
从变量读取列表
将一系列值都集中存储在了一个变量中,然后需要遍历变量中的整个列表。
#!/bin/bash
ll="a b c"
ll=$ll" dd"
for s in $ll
doecho "char $s"
done # char a
# char b
# char c
# char dd
 
迭代数组
前面介绍过数组的定义,这里使用for循环在bash shell中使用array的方式如下:
#!/bin/basharr=(1 2 3)
for i in ${arr[@]}; doecho $i
done# 1
# 2
# 3
 
${array[@]}是取数组中的所有值。
从命令读取值
生成列表中所需值的另外一个途径就是使用命令的输出。
#!/bin/bash# content of file
# a bbb
# b
# cc
# dddfile=file
for v in $(cat $file)
doecho "value from file $v"
done# value from file a
# value from file bbb
# value from file b
# value from file cc
# value from file ddd 
设置for命令分割符,bash shell中默认的分割符是空格/制表符/换行符,这是由特殊的环境变量 IFS(internal field separator),也被称为内部字段分隔符。
要解决这个问题,可以在shell脚本中临时更改 IFS 环境变量的值来限制被bash shell当作字段分隔符的字符。例如,如果修改 IFS 的值,使其只能识别换行符,那就必须这么做:
IFS=$'\n'
 
#!/bin/bash# content of file
# a bbb
# b
# cc
# dddIFS=$'\n'
file=file
for v in $(cat $file)
doecho "value from file $v"
done# value from file a bbb
# value from file b
# value from file cc
# value from file ddd 
如果要指定多个 IFS 字符,只要将它们在赋值行串起来就行。
IFS=$'\n':;"
 
用通配符读取目录
可以用 for 命令来自动遍历目录中的文件。进行此操作时,必须在文件名或路径名中
 使用通配符。它会强制shell使用文件扩展匹配。文件扩展匹配是生成匹配指定通配符的文件名或
 路径名的过程。
#!/bin/bashfor file in /home/rob/* /home/rich/badtest
doif [ -d "$file" ]thenecho "$file is a directory"elif [ -f "$file" ]thenecho "$file is a file"elseecho "$file doesn't exist"fi
done# /home/rob/模板 is a directory
# /home/rob/file is a file
# /home/rob/test1 is a file
# /home/rob/test2 is a file
# /home/rob/test.sh is a file
# /home/rich/badtest doesn't exist 
C语言风格的shell for循环
 
shell还可以支持类似C语言的for循环,变量和等号之间可以有空格,访问变量的值不需要$符号。但这会造成shell程序编写人员的困惑,减少使用。
#!\bin\bashfor (( i=1; i <= 5; i++))
doecho "The next number is $i" 
done# The next number is 1
# The next number is 2
# The next number is 3
# The next number is 4
# The next number is 5 
shell循环while命令
 
while命令允许定义一个要测试的命令,然后循环执行一组命令,只要定义的测试命令返回的是退出状态码 0 。它会在每次迭代的一开始测试 test 命令。在 test 命令返回非零退出状态码时, while 命令会停止执行那组命令。
while 命令格式
while test command
doother commands
done
 
while 命令中定义的 test command 和 if-then 语句中的格式一模一样。
最常见的 test command 的用法是用方括号来检查循环命令中用到的shell变量的值。
#!/bin/bashnu=5
while [ $nu -gt 0 ]
doecho "nu: $nu"nu=$[ $nu - 1 ]
done# nu: 5
# nu: 4
# nu: 3
# nu: 2
# nu: 1
 
while 命令允许在 while 语句行定义多个测试命令。只有最后一个测试命令的退出状态码
 会被用来决定什么时候结束循环。
#!/bin/bashnu=5
while echo $nu[ $nu -gt 0 ]
doecho "nu: $nu"nu=$[ $nu - 1 ]
done# 5
# nu: 5
# 4
# nu: 4
# 3
# nu: 3
# 2
# nu: 2
# 1
# nu: 1
# 0
 
第一个测试简单地显示了 var1 变量的当前值。第二个测试用方括号来判断 var1 变量的值。
 在循环内部, echo 语句会显示一条简单的消息,说明循环被执行了。运行本例时输出
 以0结束,说明执行了[ $nu -gt 0 ]之前的echo $nu语句。
shell 循环的until命令
 
while命令中,只要定义的测试命令返回的是退出状态码 0,while就会一直执行,在 test 命令返回非零退出状态码时, while命令会停止执行那组命令。
while test command
doother commands
done
 
until命令和 while 命令工作的方式完全相反。只有测试命令的退出状态码不为 0 ,bash shell才会执行循环中列出的命令。
until test commands
doother commands
done
 
until命令的一个实例:
#!/bin/bash
nu=8
until [ $nu -eq 0 ]
do echo $nunu=$[ $nu - 2 ]
done# 8
# 6
# 4
# 2
 
和 while 命令类似,你可以在 until 命令语句中放入多个测试命令。只有最后一个命令的退
 出状态码决定了bash shell是否执行已定义的 other commands 。
#!/bin/bash
nu=8
until [ $nu -eq 0 ]echo $nu
doecho $nunu=$[ $nu - 2 ]
done
 
shell会执行指定的多个测试命令,只有在最后一个命令成立时停止。
shell循环跳出的break/continue命令
 
break命令
当满足某个条件时,有时会希望终止循环,shell和大多数变成语言一样支持break/continue命令,其使用方法:
#!/bin/bash
for (( a=1; a<=10; a++ ))
doecho "value a $a"for((b=1; b<=10; b++ ))doecho "  value b $b"if [ $b -eq 4 ]; thenecho "  break"break 2fidone
done# break
# value 1
# value 2
# value 3
# value 4
 
值得注意的是break默认是跳出当前层的循环,而与其他大多数语言不同的是shell的break命令还支持break n参数,n表示跳出几层循环,默认为1。
#!/bin/bash
for (( a=1; a<=10; a++ ))
doecho "value a $a"for((b=1; b<=10; b++ ))doecho "  value b $b"if [ $b -eq 4 ]; thenecho "  break"break 2fidone
done# value a 1
#   value b 1
#   value b 2
#   value b 3
#   value b 4
#   break
 
如上,break会直接结束循环。在while和until循环中同样支持break命令。
continue命令
continue命令可以提前中止某次循环中的命令,但并不会完全终止整个循环。
#!/bin/bash
for (( v=1; v<=10; v++ ))
doif [ $v -gt 5 ] && [ $v -lt 8 ]; thencontinuefiecho "Iteration: $v"
done# Iteration: 1
# Iteration: 2
# Iteration: 3
# Iteration: 4
# Iteration: 5
# Iteration: 8
# Iteration: 9
# Iteration: 10
 
也可以在 while 和 until 循环中使用 continue 命令,但要特别小心。记住,当shell执行continue 命令时,它会跳过剩余的命令。
和 break 命令一样, continue 命令也允许通过命令行参数指定要继续执行哪一级循环continue n。
#!/bin/bash
for (( a = 1; a <= 5; a++ ))
doecho "Iteration $a:"for (( b = 1; b < 3; b++ ))doif [ $a -gt 2 ] && [ $a -lt 4 ]; thencontinue 2fivar3=$[ $a * $b ]echo "    The result of of $a * $b is $var3"done
done# Iteration 1:
#     The result of of 1 * 1 is 1
#     The result of of 1 * 2 is 2
# Iteration 2:
#     The result of of 2 * 1 is 2
#     The result of of 2 * 2 is 4
# Iteration 3:
# Iteration 4:
#     The result of of 4 * 1 is 4
#     The result of of 4 * 2 is 8
# Iteration 5:
#     The result of of 5 * 1 is 5
#     The result of of 5 * 2 is 10 
trick
在上面的命令中使用重定向,可以将循环中命令的结果保存到文件中。
#!/bin/bash
for (( a = 1; a <= 5; a++ ))
doecho "Iteration $a:"for (( b = 1; b < 3; b++ ))doif [ $a -gt 2 ] && [ $a -lt 4 ]; thencontinue 2fivar3=$[ $a * $b ]echo "    The result of of $a * $b is $var3"done
done > out.txt
 
还可以使用管道命令将循环的结果传递给别的命令,
#!/bin/bashfor (( a = 1; a <= 5; a++ ))
doecho "Iteration $a:"for (( b = 1; b < 3; b++ ))doif [ $a -gt 2 ] && [ $a -lt 4 ]; thencontinue 2fivar3=$[ $a * $b ]echo "    The result of of $a * $b is $var3"done
done | sort
 
欢迎访问个人网络日志🌹🌹知行空间🌹🌹
相关文章:
14.bash shell中的for/while/until循环
文章目录 shell循环语句for命令**读取列表中的值****读取列表中的复杂值****从变量读取列表**迭代数组**从命令读取值****用通配符读取目录**C语言风格的shell for循环 shell循环while命令shell 循环的until命令shell循环跳出的break/continue命令break命令continue命令trick 欢…...
RPC(6):RMI实现RPC
1RMI简介 RMI(Remote Method Invocation) 远程方法调用。 RMI是从JDK1.2推出的功能,它可以实现在一个Java应用中可以像调用本地方法一样调用另一个服务器中Java应用(JVM)中的内容。 RMI 是Java语言的远程调用,无法实现跨语言。…...
strlen和sizeof的初步理解
大家好我是Beilef,一个美好的下我接触到编程并且逐渐喜欢。我虽然不是科班出身但是我会更加努力地去学,有啥不对的地方请斧正 文章目录 目录 文章目录 前言 想必大家对sizeof肯定很了解,那对strlen又了解多少。其实这个问题应该让不少人困扰。…...
纯CSS的华为充电动画,它来了
📢 鸿蒙专栏:想学鸿蒙的,冲 📢 C语言专栏:想学C语言的,冲 📢 VUE专栏:想学VUE的,冲这里 📢 Krpano专栏:想学Krpano的,冲 🔔…...
在架构设计中,前后端分离有什么好处?
前后端分离是一种架构设计模式,将前端和后端的开发分别独立进行,它带来了多方面的好处: 1、独立开发和维护: 前后端分离允许前端和后端开发团队独立进行工作。这意味着两个团队可以并行开发,提高了整体的开发效率。前…...
C语言中的结构体和联合体:异同及应用
文章目录 C语言中的结构体和联合体:异同及应用1. 结构体(Struct)的概述代码示例: 2. 联合体(Union)的概述代码示例: 3. 结构体与联合体的异同点相同点:不同点:代码说明 结…...
文件夹共享(普通共享和高级共享的区别)防火墙设置(包括了jdk安装和Tomcat)
文章目录 一、共享文件1.1为什么需要配置文件夹共享功能?1.2配置文件共享功能1.3高级共享和普通共享的区别: 二、防火墙设置2.1先要在虚拟机上安装JDK和Tomcat供外部访问。2.2设置防火墙: 一、共享文件 1.1为什么需要配置文件夹共享功能&…...
❀My排序算法学习之冒泡排序❀
目录 冒泡排序(Bubble Sort):) 一、定义 二、算法原理 三、算法分析 时间复杂度 算法稳定性 算法描述 C语言 C++ 算法比较 插入排序 选择排序 快速排序 归并排序 冒泡排序(Bubble Sort):) 一、定义 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单…...
服务器数据恢复-raid6离线磁盘强制上线后分区打不开的数据恢复案例
服务器数据恢复环境: 服务器上有一组由12块硬盘组建的raid6磁盘阵列,raid6阵列上层有一个lun,映射到WINDOWS系统上使用,WINDOWS系统划分了一个GPT分区。 服务器故障&分析: 服务器在运行过程中突然无法访问。对服务…...
Zookeeper在分布式命名服务中的实践
Java学习面试指南:https://javaxiaobear.cn 命名服务是为系统中的资源提供标识能力。ZooKeeper的命名服务主要是利用ZooKeeper节点的树形分层结构和子节点的顺序维护能力,来为分布式系统中的资源命名。 哪些应用场景需要用到分布式命名服务呢࿱…...
说说 Spring Boot 实现接口幂等性有哪几种方案?
一、什么是幂等性 幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。 在计算机中编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数或幂等…...
Dash中的callback的使用 多input 6
代码说明 import plotly.express as pxmport plotly.express as px用于导入plotly.express模块并给它起一个别名px。这样在后续的代码中,你可以使用px来代替plotly.express,使代码更加简洁。 plotly.express是Plotly的一个子模块,用于快速创…...
平方矩阵()
平方矩阵1 平方矩阵2 曼哈顿距离 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring>using namespace std;const int N 110;int n; int a[N][N];int main() {while(cin >> n, n){for (int i 0; i < n; i )fo…...
git基本命令
1、安装 介绍 安装 配置 2、git基本命令 2.1 基本操作 #1、查看空目录的git状态 $ git status fatal: not a git repository (or any of the parent directories): .git#2、初始化本地仓库:创建一个git的目录管理当前项目的所有文件版本 $ git init Initializ…...
GPU性能实时监测的实用工具
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
概率论中的 50 个具有挑战性的问题 [第 6 部分]:Chuck-a-Luck
一、说明 我最近对与概率有关的问题产生了兴趣。我偶然读到了弗雷德里克莫斯特勒(Frederick Mosteller)的《概率论中的五十个具有挑战性的问题与解决方案》)一书。我认为创建一个系列来讨论这些可能作为面试问题出现的迷人问题会很有趣。每篇…...
windows搭建MySQL主从补充说明
这3种情况是在HA切换时,由于是异步复制,且sync_binlog0,会造成一小部分binlog没接收完导致同步报错。 第一种:在master上删除一条记录,而slave上找不到。 第二种:主键重复。在slave已经有该记录ÿ…...
Python:GUI Tkinter
GUI编程 GUI编程(Graphical User Interface Programming)指的是用于创建图形用户界面的程序设计。这种界面采用图形方式显示信息,让用户可以通过图形化的方式与程序进行交互,而不是仅仅通过文本命令。GUI编程使得软件更加直观易用…...
制作一个可以离线安装的Visual Studio安装包
须知 前提条件,需要电脑可以正常上网且网速还行,硬盘可以空间容量足够大,怎么判断容量够用?由组件数量的多少来决定。Visual Studio 频道和发布节奏 https://learn.microsoft.com/zh-cn/visualstudio/productinfo/release-rhythm…...
机器学习——决策树(三)
【说明】文章内容来自《机器学习——基于sklearn》,用于学习记录。若有争议联系删除。 1、案例一 决策树用于是否赖床问题。 采用决策树进行分类,要经过数据采集、特征向量化、模型训练和决策树可视化4个步骤。 赖床数据链接:https://pan…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
【汇编逆向系列】六、函数调用包含多个参数之多个整型-参数压栈顺序,rcx,rdx,r8,r9寄存器
从本章节开始,进入到函数有多个参数的情况,前面几个章节中介绍了整型和浮点型使用了不同的寄存器在进行函数传参,ECX是整型的第一个参数的寄存器,那么多个参数的情况下函数如何传参,下面展开介绍参数为整型时候的几种情…...
[C++错误经验]case语句跳过变量初始化
标题:[C错误经验]case语句跳过变量初始化 水墨不写bug 文章目录 一、错误信息复现二、错误分析三、解决方法 一、错误信息复现 write.cc:80:14: error: jump to case label80 | case 2:| ^ write.cc:76:20: note: crosses initialization…...
运动控制--BLDC电机
一、电机的分类 按照供电电源 1.直流电机 1.1 有刷直流电机(BDC) 通过电刷与换向器实现电流方向切换,典型应用于电动工具、玩具等 1.2 无刷直流电机(BLDC) 电子换向替代机械电刷,具有高可靠性,常用于无人机、高端家电…...
