当前位置: 首页 > news >正文

14.bash shell中的for/while/until循环

文章目录

    • `shell`循环语句`for`命令
      • **读取列表中的值**
      • **读取列表中的复杂值**
      • **从变量读取列表**
      • 迭代数组
      • **从命令读取值**
      • **用通配符读取目录**
      • `C`语言风格的`shell for`循环
    • `shell`循环`while`命令
    • `shell` 循环的`until`命令
    • `shell`循环跳出的`break/continue`命令
      • break命令
      • continue命令
      • trick


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


shell循环语句for命令

bash shellfor 命令的基本格式:

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 commandif-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命令中,只要定义的测试命令返回的是退出状态码 0while就会一直执行,在 test 命令返回非零退出状态码时, while命令会停止执行那组命令。

while test command
doother commands
done

until命令和 while 命令工作的方式完全相反。只有测试命令的退出状态码不为 0bash 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默认是跳出当前层的循环,而与其他大多数语言不同的是shellbreak命令还支持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会直接结束循环。在whileuntil循环中同样支持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

也可以在 whileuntil 循环中使用 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推出的功能&#xff0c;它可以实现在一个Java应用中可以像调用本地方法一样调用另一个服务器中Java应用&#xff08;JVM&#xff09;中的内容。 RMI 是Java语言的远程调用&#xff0c;无法实现跨语言。…...

strlen和sizeof的初步理解

大家好我是Beilef&#xff0c;一个美好的下我接触到编程并且逐渐喜欢。我虽然不是科班出身但是我会更加努力地去学&#xff0c;有啥不对的地方请斧正 文章目录 目录 文章目录 前言 想必大家对sizeof肯定很了解&#xff0c;那对strlen又了解多少。其实这个问题应该让不少人困扰。…...

纯CSS的华为充电动画,它来了

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; Krpano专栏&#xff1a;想学Krpano的&#xff0c;冲 &#x1f514…...

在架构设计中,前后端分离有什么好处?

前后端分离是一种架构设计模式&#xff0c;将前端和后端的开发分别独立进行&#xff0c;它带来了多方面的好处&#xff1a; 1、独立开发和维护&#xff1a; 前后端分离允许前端和后端开发团队独立进行工作。这意味着两个团队可以并行开发&#xff0c;提高了整体的开发效率。前…...

C语言中的结构体和联合体:异同及应用

文章目录 C语言中的结构体和联合体&#xff1a;异同及应用1. 结构体&#xff08;Struct&#xff09;的概述代码示例&#xff1a; 2. 联合体&#xff08;Union&#xff09;的概述代码示例&#xff1a; 3. 结构体与联合体的异同点相同点&#xff1a;不同点&#xff1a;代码说明 结…...

文件夹共享(普通共享和高级共享的区别)防火墙设置(包括了jdk安装和Tomcat)

文章目录 一、共享文件1.1为什么需要配置文件夹共享功能&#xff1f;1.2配置文件共享功能1.3高级共享和普通共享的区别&#xff1a; 二、防火墙设置2.1先要在虚拟机上安装JDK和Tomcat供外部访问。2.2设置防火墙&#xff1a; 一、共享文件 1.1为什么需要配置文件夹共享功能&…...

❀My排序算法学习之冒泡排序❀

目录 冒泡排序(Bubble Sort):) 一、定义 二、算法原理 三、算法分析 时间复杂度 算法稳定性 算法描述 C语言 C++ 算法比较 插入排序 选择排序 快速排序 归并排序 冒泡排序(Bubble Sort):) 一、定义 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单…...

服务器数据恢复-raid6离线磁盘强制上线后分区打不开的数据恢复案例

服务器数据恢复环境&#xff1a; 服务器上有一组由12块硬盘组建的raid6磁盘阵列&#xff0c;raid6阵列上层有一个lun&#xff0c;映射到WINDOWS系统上使用&#xff0c;WINDOWS系统划分了一个GPT分区。 服务器故障&分析&#xff1a; 服务器在运行过程中突然无法访问。对服务…...

Zookeeper在分布式命名服务中的实践

Java学习面试指南&#xff1a;https://javaxiaobear.cn 命名服务是为系统中的资源提供标识能力。ZooKeeper的命名服务主要是利用ZooKeeper节点的树形分层结构和子节点的顺序维护能力&#xff0c;来为分布式系统中的资源命名。 哪些应用场景需要用到分布式命名服务呢&#xff1…...

说说 Spring Boot 实现接口幂等性有哪几种方案?

一、什么是幂等性 幂等是一个数学与计算机学概念&#xff0c;在数学中某一元运算为幂等时&#xff0c;其作用在任一元素两次后会和其作用一次的结果相同。 在计算机中编程中&#xff0c;一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数或幂等…...

Dash中的callback的使用 多input 6

代码说明 import plotly.express as pxmport plotly.express as px用于导入plotly.express模块并给它起一个别名px。这样在后续的代码中&#xff0c;你可以使用px来代替plotly.express&#xff0c;使代码更加简洁。 plotly.express是Plotly的一个子模块&#xff0c;用于快速创…...

平方矩阵()

平方矩阵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、初始化本地仓库&#xff1a;创建一个git的目录管理当前项目的所有文件版本 $ git init Initializ…...

GPU性能实时监测的实用工具

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

概率论中的 50 个具有挑战性的问题 [第 6 部分]:Chuck-a-Luck

一、说明 我最近对与概率有关的问题产生了兴趣。我偶然读到了弗雷德里克莫斯特勒&#xff08;Frederick Mosteller&#xff09;的《概率论中的五十个具有挑战性的问题与解决方案》&#xff09;一书。我认为创建一个系列来讨论这些可能作为面试问题出现的迷人问题会很有趣。每篇…...

windows搭建MySQL主从补充说明

这3种情况是在HA切换时&#xff0c;由于是异步复制&#xff0c;且sync_binlog0&#xff0c;会造成一小部分binlog没接收完导致同步报错。 第一种&#xff1a;在master上删除一条记录&#xff0c;而slave上找不到。 第二种&#xff1a;主键重复。在slave已经有该记录&#xff…...

Python:GUI Tkinter

GUI编程 GUI编程&#xff08;Graphical User Interface Programming&#xff09;指的是用于创建图形用户界面的程序设计。这种界面采用图形方式显示信息&#xff0c;让用户可以通过图形化的方式与程序进行交互&#xff0c;而不是仅仅通过文本命令。GUI编程使得软件更加直观易用…...

制作一个可以离线安装的Visual Studio安装包

须知 前提条件&#xff0c;需要电脑可以正常上网且网速还行&#xff0c;硬盘可以空间容量足够大&#xff0c;怎么判断容量够用&#xff1f;由组件数量的多少来决定。Visual Studio 频道和发布节奏 https://learn.microsoft.com/zh-cn/visualstudio/productinfo/release-rhythm…...

机器学习——决策树(三)

【说明】文章内容来自《机器学习——基于sklearn》&#xff0c;用于学习记录。若有争议联系删除。 1、案例一 决策树用于是否赖床问题。 采用决策树进行分类&#xff0c;要经过数据采集、特征向量化、模型训练和决策树可视化4个步骤。 赖床数据链接&#xff1a;https://pan…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...