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

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


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

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

相关文章

MongoDB数字字符串排序问题

问题描述 MongoDB中有一个集合t_test_sort结构如下&#xff0c;其中数值字段value为字符串类型&#xff0c;现想按照value的数值大小进行降序排列。 {"_id" : ObjectId("656c87b36ca8100cd4a60348"),"name" : "麻了","date&quo…

《Spring Cloud学习笔记:Nacos配置管理 OpenFeign LoadBalancer Getway》

基于Feign的声明式远程调用&#xff08;代码更优雅&#xff09;&#xff0c;用它来去代替我们之前的RestTemplate方式的远程调用 1. Nacos配置管理&#xff1a;Nacos Config 服务配置中心介绍 首先我们来看一下,微服务架构下关于配置文件的一些问题&#xff1a; 配置文件相…

OpenGL :LearnOpenGL笔记

glfw https://github.com/JoeyDeVries/LearnOpenGL/blob/master/src/1.getting_started/1.1.hello_window/hello_window.cpp #include <glad/glad.h>// 注: GLAD的include文件包含所需的OpenGL头文件(如GL/GL.h) &#xff0c;因此确保在其他需要OpenGL的头文件 (如GLFW…

安装向日葵并设置开机自启动

Ubuntu/Deepin系统&#xff1a; 下载向日葵远程安装包 向日葵远程控制app官方下载 - 贝锐向日葵官网向日葵远程控制app官方下载 - 贝锐向日葵官网 图形版安装 图形版下载到本地&#xff0c;然后上传到服务器/home/narada目录下 apt install SunloginClient_11.0.1.44968_am…

添加调试日志,bug消失

参考&#xff1a;就删了个printf&#xff0c;代码崩了&#xff01; 1、运行报错代码 #include "stdio.h" #include "stdlib.h" #include "string.h"void func1() {int arr[10];memset(arr, 1, sizeof(arr)); }void func2() {int index;int* ar…

【PTA】L1-32 Left-pad (C++)

题目链接&#xff1a;L1-032 Left-pad 题目要求&#xff1a; 根据新浪微博上的消息&#xff0c;有一位开发者不满NPM&#xff08;Node Package Manager&#xff09;的做法&#xff0c;收回了自己的开源代码&#xff0c;其中包括一个叫left-pad的模块&#xff0c;就是这个模块…

亚马逊,速卖通,lazada卖家如何快速提升新品星级与评论数量

补单测评在所有的跨境电商中扮演着重要的角色&#xff0c;商家们了解到补单可以快速增加产品的销量、评论数量&#xff0c;提升排名&#xff0c;从而打造爆款产品。产品的购买率和评价对于转化率和平台排名至关重要&#xff01;当排名不断提高&#xff0c;带来的流量也会增加&a…

Java框架基础--maven,http,postman

maven Maven 提供了一个标准的构建生命周期和一组约定的目录结构&#xff0c;以简化和规范项目的构建过程。它主要用于 Java 项目&#xff0c;但也可以用于其他类型的项目。提高了项目的可维护性、可重复性和一致性&#xff0c;简化了构建和依赖管理的复杂性&#xff0c;使得开…

Java guava partition方法拆分集合自定义集合拆分方法

日常开发中&#xff0c;经常遇到拆分集合处理的场景&#xff0c;现在记录2中拆分集合的方法。 1. 使用Guava包提供的集合操作工具栏 Lists.partition()方法拆分 首先&#xff0c;引入maven依赖 <dependency><groupId>com.google.guava</groupId><artifa…

抚琴成一快-琶音

琶音 0.导读1.定义2.作用3.注意事项4.练习方法1.前置知识2.和弦指型图1.大三和弦琶音指型2.小三和弦琶音指型3.大七和弦琶音指型4.小七和弦琶音指型5.属七和弦琶音指型 3.演奏方法1.拨弦方式2.节奏3.其他 99.参考 0.导读 在吉他学习的过程中&#xff0c;大家或多或少都会听到过…

模型树实操

很多时候&#xff0c;数据都是有层级和分类的&#xff0c;使用laravel的Dcat框架&#xff0c;可以快速搭建一个结构清晰、且可以鼠标拖拽排序的后台&#xff1b;先上例子更直观&#xff1a; 这里是Dcat的模型树使用文档&#xff0c;戳一下&#xff1b; 重点注意事项有&#x…

2024最新前端React面试题:React18相比react17有哪些主要更新?

React18相比react17有哪些主要更新&#xff1f; 回答思路&#xff1a;1.setState和自动批处理-->2.新增root API--> 3.并发模式渲染-->4.不对IE浏览器支持-->5.react组件返回值更新-->6.strict mode更新-->7.react18支持useId-->8.-->Concurrent Mode-…

渗透测试(Lab4.2)

配置WebDeveloper的时候遇到一个错误 导入失败&#xff0c;因为 E:…ovf 未通过 OVF 规范一致性或虚拟硬件合规性检查。 请单击“重试”放松 OVF 规范与虚拟硬件合规性检查&#xff0c;并重新尝试导入&#xff1b; 或单击“取消”以取消导入。如果重新尝试导入&#xff0c;可能…

互联网摸鱼日报(2023-12-26)

互联网摸鱼日报(2023-12-26) 36氪新闻 折射OpenAI新一年技术路线图&#xff0c;透视Sam Altman的12个愿望清单 AIGC明星独角兽被曝卖身&#xff0c;投资者点名CEO下台&#xff0c;9个月流失15名高管 蔚来向上&#xff0c;靠80万元的ET9行不行&#xff1f; 为了让你在游戏里…

redis和数据库的同步问题

今天突然想起来这个&#xff0c;就是那么突然&#xff0c;上次项目上用过redis&#xff0c;是一个消息已读未读的问题&#xff0c;由于消息挺多的&#xff0c;如果每次都去查数据库&#xff0c;那岂不是裂开&#xff0c;所以就存缓存了。 现在想想&#xff0c;还是不大行&#…

报修系统的流程是怎么样的?有什么好用的售后工单管理系统推荐?

很多制造业公司为了做好售后报修服务&#xff0c;会特意建立一个售后报修系统。我以前有一个做家电的客户&#xff0c;他们公司就是用一个工单系统来处理消费者报修的问题&#xff0c;效果挺不错的。消费者买到的产品有问题的话&#xff0c;直接用微信扫描说明书上面的小程序码…

算法题Python常用内置函数、方法、技巧汇总(其四:数字)

文章目录 数字相关操作整除与求余取整无穷大进制转换 华为OD算法/大厂面试高频题算法练习冲刺训练 数字相关操作 整除与求余 一般而言&#xff0c;我们使用整除运算//和求余运算%来计算两个整数相除的商和余数。 div 10 // 4 mod 10 % 4如果想要同时得到商和余数&#xff…

Ubuntu22.04-安装后Terminal无法调出

参考&#xff1a; Ubuntu20.04 终端打开不了的问题排查_ubuntu终端打不开-CSDN博客 https://blog.csdn.net/u010092716/article/details/130968032 Ubuntu修改locale从而修改语言环境_ubuntu locale-CSDN博客 https://blog.csdn.net/aa1209551258/article/details/81745394 问…

mac使用idea插件 java decomplier反编译jar包

安装插件 这样在本地idea的插件目录下就有 命令 #创建文件夹&#xff0c;用以存放反编译结果jar包 mkdir test#开始反编译文件 java -cp "/Applications/IntelliJ IDEA.app/Contents/plugins/java-decompiler/lib/java-decompiler.jar" org.jetbrains.java.decompil…

【深度学习-目标检测】05 - YOLOv1 论文学习与总结

论文地址&#xff1a;You Only Look Once:Unified, Real-Time Object Detection 论文学习 1. 摘要 YOLO的提出&#xff1a;作者提出了YOLO&#xff0c;这是一种新的目标检测方法。与传统的目标检测方法不同&#xff0c;YOLO将目标检测视为一个回归问题&#xff0c;直接从图像…