【linux】shell(32)-循环控制

for循环

在 Shell 脚本中,for 循环是一种常见的循环结构,用于遍历列表、数组或命令输出。

基本语法

for 循环的基本语法如下:

#!/bin/bash
for variable in list
docommands
done
  • variable 是一个临时变量,用于存储每次迭代中的当前项。
  • list 可以是空格分隔的值、文件名、命令输出等。
  • commands 是循环体中要执行的命令。

简单示例

遍历列表

#!/bin/bash
for color in red green blue
doecho "Color: $color"
done

运行输出:

Color: red
Color: green
Color: blue

遍历数字范围

可以使用 Brace Expansion 或 seq 命令来生成数字范围。

使用 Brace Expansion
#!/bin/bash
for i in {1..5}
doecho "Number: $i"
done
使用 seq 命令
#!/bin/bash
for i in $(seq 1 5)
doecho "Number: $i"
done

遍历数组

定义和遍历数组
#!/bin/bash
fruits=("apple" "banana" "cherry")for fruit in "${fruits[@]}"
doecho "Fruit: $fruit"
done

使用命令输出进行循环

可以将命令输出作为列表来进行循环。

遍历文件名
#!/bin/bash
for file in $(ls)
doecho "File: $file"
done
遍历命令输出
#!/bin/bash
for user in $(cut -d: -f1 /etc/passwd)
doecho "User: $user"
done

嵌套 for 循环

可以在 for 循环中嵌套另一个 for 循环。

#!/bin/bash
for i in {1..3}
dofor j in {a..c}doecho "Combination: $i$j"done
done

运行输出:

Combination: 1a
Combination: 1b
Combination: 1c
Combination: 2a
Combination: 2b
Combination: 2c
Combination: 3a
Combination: 3b
Combination: 3c

示例脚本

计算文件总大小

计算当前目录中所有文件的总大小。

#!/bin/bash
total_size=0for file in $(ls)
doif [ -f $file ]; thensize=$(stat -c%s "$file")total_size=$((total_size + size))fi
doneecho "Total size: $total_size bytes"

生成乘法表

生成一个简单的乘法表。

#!/bin/bash
for i in {1..9}
dofor j in {1..9}doresult=$((i * j))echo -n "$i*$j=$result "doneecho ""
done

while 循环

while 循环是 Shell 脚本中常用的循环结构之一。它用于在条件为真时反复执行一组命令。

基本语法

while 循环的基本语法如下:

#!/bin/bash
while [ condition ]
docommands
done
  • condition 是一个测试条件,当条件为真(返回状态为 0)时,循环继续执行。
  • commands 是循环体中的命令。

简单示例

打印数字

使用 while 循环打印 1 到 5 的数字:

#!/bin/bash
count=1
while [ $count -le 5 ]
doecho "Number: $count"count=$((count + 1))
done

运行输出:

Number: 1
Number: 2
Number: 3
Number: 4
Number: 5

无限循环

可以创建一个无限循环,直到满足某个条件时使用 break 退出:

#!/bin/bash
while true
doecho "This is an infinite loop. Press Ctrl+C to stop."sleep 1
done

读取用户输入

使用 while 循环读取用户输入,直到输入 exit 时退出循环:

#!/bin/bash
input=""
while [ "$input" != "exit" ]
doecho "Enter something (type 'exit' to quit):"read inputecho "You entered: $input"
done

从文件读取行

使用 while 循环逐行读取文件内容:

#!/bin/bash
filename="test.txt"
while IFS= read -r line
doecho "Line: $line"
done < "$filename"

嵌套 while 循环

可以在 while 循环中嵌套另一个 while 循环:

#!/bin/bash
outer=1
while [ $outer -le 3 ]
doinner=1while [ $inner -le 3 ]doecho "Outer: $outer, Inner: $inner"inner=$((inner + 1))doneouter=$((outer + 1))
done

运行输出:

Outer: 1, Inner: 1
Outer: 1, Inner: 2
Outer: 1, Inner: 3
Outer: 2, Inner: 1
Outer: 2, Inner: 2
Outer: 2, Inner: 3
Outer: 3, Inner: 1
Outer: 3, Inner: 2
Outer: 3, Inner: 3

实际示例

下载文件直到成功

尝试下载文件,直到成功为止:

#!/bin/bash
url="http://example.com/file.zip"
output="file.zip"while ! curl -O $url
doecho "Download failed, retrying in 5 seconds..."sleep 5
doneecho "Download completed."

until循环

Shell 脚本 中,until 循环是一种条件循环结构,它用于在条件未满足(条件为 false)时重复执行代码块。一旦条件满足(即变为 true),循环将终止。

until 循环是 while 循环的反向逻辑:

  • while 循环:当条件为 true 时执行循环体。
  • until 循环:当条件为 false 时执行循环体。

语法格式

until [ 条件 ]
do# 循环体:当条件为false时执行命令
done
  • until 后面的条件被测试:
    • 如果条件为 false,执行 do 块中的代码。
    • 每次循环结束后,重新测试条件,直到条件为 true 时终止循环。

基本示例

示例:简单的计数器

#!/bin/bash
# 使用 until 循环打印1到5的数字count=1until [ $count -gt 5 ]; doecho "Count: $count"((count++))  # 增加计数器
doneecho "Loop finished."

输出结果

Count: 1
Count: 2
Count: 3
Count: 4
Count: 5
Loop finished.

解析

  1. 初始值 count=1
  2. 条件 [ $count -gt 5 ] 表示 “count 大于 5”。
  3. count <= 5 的情况下,条件为 false,因此执行循环体。
  4. 每次循环后,count 递增 1。
  5. count > 5 时,条件为 true,循环结束。

使用 until 循环读取用户输入

#!/bin/bash
# 直到用户输入 "yes" 才终止循环input=""until [ "$input" == "yes" ]; doread -p "请输入 'yes' 来退出循环: " input
doneecho "你输入了 'yes',循环结束。"

输出

请输入 'yes' 来退出循环: no
请输入 'yes' 来退出循环: maybe
请输入 'yes' 来退出循环: yes
你输入了 'yes',循环结束。

解析

  • read 命令用于从用户输入中读取数据。
  • until 循环判断用户输入是否等于 "yes",直到条件满足为止。

until 循环与 break 结合使用

你可以使用 break 命令在 until 循环中提前终止循环。

#!/bin/bash
count=1until [ $count -gt 10 ]; doecho "Count: $count"if [ $count -eq 5 ]; thenecho "提前终止循环"breakfi((count++))
doneecho "循环结束"

输出

Count: 1
Count: 2
Count: 3
Count: 4
Count: 5
提前终止循环
循环结束

解析

  • count 等于 5 时,break 命令强制终止循环。

until 循环与 continue 结合使用

continue 命令用于跳过当前迭代,继续下一次循环。

#!/bin/bash
count=0until [ $count -ge 5 ]; do((count++))if [ $((count % 2)) -eq 0 ]; thencontinue  # 跳过偶数fiecho "Odd Count: $count"
done

输出

Odd Count: 1
Odd Count: 3
Odd Count: 5

解析

  • continue 跳过偶数的输出,只显示奇数值。

whileuntil 的对比

特性while 循环until 循环
执行条件条件为 true 时执行条件为 false 时执行
执行逻辑反复执行直到条件变为 false反复执行直到条件变为 true
使用场景已知条件满足时,继续执行任务直到特定条件满足时才停止任务
示例条件[ $count -le 5 ] (小于等于5时)[ $count -gt 5 ] (大于5时停止)

示例对比

  • while 循环
count=1
while [ $count -le 5 ]; doecho $count((count++))
done
  • until 循环
count=1
until [ $count -gt 5 ]; doecho $count((count++))
done

两者的输出是相同的,但逻辑的书写顺序相反。


breakcontinue

在Shell脚本中,breakcontinue 是用于控制循环流的关键字。它们可以用于 forwhileuntil 循环中,以改变程序的执行顺序。


break 命令

break 命令用于终止当前所在的循环结构。它会立即跳出当前的循环,无论循环条件是否还满足。

语法

break [n]
  • n 是可选的,表示跳出第 n 层的循环。
    • n = 1(默认值):跳出当前循环。
    • n > 1:跳出外层的多重循环。

使用示例:

示例1:跳出单层循环
#!/bin/bash
for i in {1..5}; doecho "Number: $i"if [ $i -eq 3 ]; thenecho "Breaking out of loop."breakfi
done
echo "Loop terminated."

输出

Number: 1
Number: 2
Number: 3
Breaking out of loop.
Loop terminated.

解释:当 i 等于3时,break 会终止整个循环。

示例2:跳出多层循环
#!/bin/bash
for i in {1..3}; dofor j in {1..3}; doecho "i=$i, j=$j"if [ $j -eq 2 ]; thenbreak 2  # 跳出两层循环fidone
done
echo "Exited both loops."

输出

i=1, j=1
i=1, j=2
Exited both loops.

解释:break 2 跳出所有嵌套的循环结构。


continue 命令

continue 命令用于跳过当前循环中的剩余部分,直接进入下一次循环的开始处。它不会终止整个循环,而是继续执行下一个迭代。

语法

continue [n]
  • n 是可选的,表示跳过当前第 n 层循环的剩余部分。
    • n = 1(默认值):跳过当前循环的当前迭代。
    • n > 1:跳过外层的多重循环。

使用示例:

示例1:跳过单层循环的迭代
#!/bin/bash
for i in {1..5}; doif [ $i -eq 3 ]; thenecho "Skipping number: $i"continuefiecho "Number: $i"
done

输出

Number: 1
Number: 2
Skipping number: 3
Number: 4
Number: 5

解释:当 i 等于3时,continue 跳过当前迭代,输出 Number: 3 被跳过。

示例2:跳过嵌套循环中的某层迭代
#!/bin/bash
for i in {1..3}; dofor j in {1..3}; doif [ $j -eq 2 ]; thenecho "Skipping inner loop when j=$j"continue 2  # 跳过外层循环的当前迭代fiecho "i=$i, j=$j"done
done

输出

i=1, j=1
Skipping inner loop when j=2
i=2, j=1
Skipping inner loop when j=2
i=3, j=1
Skipping inner loop when j=2

解释:continue 2 使外层循环跳过当前迭代,而不仅仅是内层循环。


breakcontinue 的区别

功能breakcontinue
作用终止整个循环跳过当前迭代,继续下一次循环
范围可以指定跳出多层循环可以指定跳过多层循环的迭代
用途完全停止循环控制循环内某些条件下的跳过行为

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

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

相关文章

Pydantic 动态字段:使用和不使用 `@computed_field` 的对比指南

Pydantic 动态字段&#xff1a;使用和不使用 computed_field 的对比指南 安装 Pydantic不使用 computed_field 的实现特性 使用 computed_field 的实现特性 使用和不使用 computed_field 的对比适用场景分析什么时候不需要 computed_field&#xff1f;什么时候使用 computed_fi…

Docker Engine多平台镜像构建(ARM64、x64、riscv64...)

Docker Engine多平台镜像构建(ARM64、x64、riscv64…) 1. Docker Engine安装 设置 Docker 的存储库# Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://do…

连续大涨,汉王科技跑步进入AI应用舒适区

OpenAI正在进行的“12天12场直播”让行业再次沸腾&#xff0c;二级市场也在寻找AI应用的机会。这刺激了12月首周同花顺sora概念涨超11&#xff05;&#xff0c;远超同期大盘指数涨幅。 截至目前&#xff0c;“满血版”推理模型o1和月收费高达200美元的ChatGPT Pro订阅服务&…

[MySQL基础](三)SQL--图形化界面+DML

本专栏内容为&#xff1a;MySQL学习专栏 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;MySql &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识 目录 图…

基于单片机的智能灯光控制系统

摘要 现在的大部分的大学&#xff0c;都是采用了一种“绿色”的教学方式&#xff0c;再加上现在的大学生缺乏环保意识&#xff0c;所以在学校里很多的教室&#xff0c;在白天的时候灯都会打开&#xff0c;这是一种极大的浪费&#xff0c;而且随时都有可能看到&#xff0c;这是…

数据分析及应用:滴滴出行打车日志数据分析

目录 0 日志数据集介绍 1 构建数据仓库 1.1 ods创建用户打车订单表 1.2 创建分区 1.3 上传到对应分区

解决Windows与Ubuntu云服务器无法通过Socket(udp)通信问题

今天在写Socket通信代码的时候&#xff0c;使用云服务器自己与自己通信没有问题&#xff0c;但是当我们把客户端换为Windows系统的时候却无法发送信息到Linux当中&#xff0c;耗时一上午终于搞定了&#x1f612;。 问题&#xff1a; 如上图&#xff0c;当我在windows的客户端…

网络安全基本命令

网络安全基本命令 想学会网络安全,就必须学会基本的网络常用命令,才能更好的去掌握网络,保护自己的系统&#xff0c;防止入侵。我们必须学会的基本的网络命令主要是基于Windows NT平台下的基本命令&#xff0c;也就是说windows 98/windows ME的下部分命令是不能运行的。所以说&…

帝可得-运营管理App

运营管理App Android模拟器 本项目的App客户端部分已经由前端团队进行开发完成&#xff0c;并且以apk的方式提供出来&#xff0c;供我们测试使用&#xff0c;如果要运行apk&#xff0c;需要先安装安卓的模拟器。 可以选择国内的安卓模拟器产品&#xff0c;比如&#xff1a;网…

Android显示系统(07)- OpenGL ES - 纹理Texture

Android显示系统&#xff08;02&#xff09;- OpenGL ES - 概述 Android显示系统&#xff08;03&#xff09;- OpenGL ES - GLSurfaceView的使用 Android显示系统&#xff08;04&#xff09;- OpenGL ES - Shader绘制三角形 Android显示系统&#xff08;05&#xff09;- OpenGL…

二十万分之一几率:if语句变do-while卡死问题分析

背景 某次灰度发布之后没多久就收到线上ANR告警&#xff0c;经排查定位到是某个页面onCreate方法执行太久导致&#xff0c;而火焰图中的耗时堆栈指向了我们用于监控页面启动速度的一段插桩代码&#xff0c;反编译Apk之后发现本该是if语句的代码竟变成了一个do-while语句&#…

React v19稳定版发布12.5

&#x1f916; 作者简介&#xff1a;水煮白菜王 &#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧✍。 感谢支持&#x1f495;&#x1f495;&#x1f495; 目…

Android笔记【17】返回数据的两种方法

目录 一、问题 二、具体分析 1、代码 2、区别 1. 目的和使用场景 resultLauncher startActivity 2. 数据传递方式 3. 返回结果的管理 4. 代码示例对比 使用 resultLauncher 启动活动并处理返回结果&#xff1a; 使用 startActivity 启动活动&#xff08;不处理返回&…

flutter修改状态栏学习

在flutter中如何动态更改状态栏的颜色和风格。 前置知识点学习 AnnotatedRegion AnnotatedRegion 是 Flutter 中的一个小部件&#xff0c;用于在特定区域中提供元数据&#xff08;metadata&#xff09;以影响某些系统级的行为或外观。它通常用于改变系统 UI 的外观&#xff…

功能篇:JAVA使用jwt

在Java中实现JWT&#xff08;JSON Web Token&#xff09;认证通常涉及以下几个步骤&#xff1a; 1. 添加依赖 2. 创建JWT工具类 3. 实现登录接口&#xff0c;生成JWT 4. 实现过滤器&#xff0c;验证JWT ### 1. 添加依赖 首先&#xff0c;你需要在项目中添加JWT库的依赖。如果…

Chrome扩展程序开发示例

项目文件夹内文件如下&#xff1a; manifest.json文件内容&#xff1a; {"manifest_version": 3,"name": "我的法宝","description": "我的有魔法的宝贝","version": "1.0","icons": {"…

前端知识1html

VScode一些快捷键 Ctrl/——注释 !——生成html框架元素 *n——生成n个标签 直接书写html的名字回车生成对应的标签 常见标签 span&#xff1a; <span style"color: red;">hello</span> <span>demo</span> span实现&#xff1a; 标题…

计算机键盘简史 | 键盘按键功能和指法

注&#xff1a;本篇为 “计算机键盘简史 | 键盘按键功能和指法” 相关文章合辑。 英文部分机翻未校。 The Evolution of Keyboards: From Typewriters to Tech Marvels 键盘的演变&#xff1a;从打字机到技术奇迹 Introduction 介绍 The keyboard has journeyed from a humb…

mongoDb的读session和写session权限报错问题

go在使用mongoDb时用到了全局会话&#xff0c;发现在创建的session的逻辑相同&#xff0c;首先会进行数据的查询&#xff0c;此时获取了全局session执行读操作&#xff0c;查询所有文档&#xff0c;则当前会话为读会话&#xff0c;当再去插入时发现会报错&#xff0c;此时sessi…

【C++】求第二大的数详细解析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;输入描述&#x1f4af;解题思路分析1. 题目核心要求2. 代码实现与解析3. 核心逻辑逐步解析定义并初始化变量遍历并处理输入数据更新最大值与次大值输…