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

bash shell笔记——循环结构

0 引言

本文主要介绍linux bash shell循环结构的基本使用

1 测试环境

查看系统版本:
uname -a : Ubuntu 18.04

查看bash版本:
bash -version : GNU bash, version 4.4.20(1)-release

创建.sh文件:
vim 00test.sh

修改00test.sh权限:
chmod 777 00test.sh 或 chmod +x 00test.sh

修改文件内容并保存:

#!/bin/bash
echo "Hello World!"

执行.sh文件:
./00test.sh

完成上述操作后会在终端中打印“Hello World!”,到此,一个简单的shell脚本就完成了,本文后续内容将不再重复上述步骤

2 for循环
#!/bin/bash 
# 用 /bin/bash 这个可执行文件来解释并运行这个脚本# shell使用“#”进行单行注释# ----------------------------------------------------------
# 1 C 语言风格的 for 命令(单个变量)
for (( i=0; i<10; i++ ))
do# 使用“echo”命令来打印文本,类似于C中的“printf”# 若打印的是变量,需要在变量名前加“$”,类似于C语言的“%d”echo "num : $i"
done# ----------------------------------------------------------
# 2 C 语言风格的 for 命令(多个变量)
for (( i=0, j=9; i<10; i++, j-- ))
doecho "num_i : $i  num_j : $j"
done# ----------------------------------------------------------
# 3 读取列表中的值
for num in 1 2 3 4 5
doecho "num : $num"
done# ----------------------------------------------------------
# 4 读取列表中的复杂值
# 优雅的遍历 I'm from Xi'an and used to be in New York
# for循环假定每个值都是用空格分割的,
# 对于包含空格的数据值可用双引号括起来
# 如果要使用单引号,需要在单引号前加“\”或使用双引号括起来
for word in I\'m from "Xi'an" and used to be in "New York" 
doecho "word : $word"
done# ----------------------------------------------------------
# 5 从变量读取列表
# 定义变量list
list="1 2 3 4 5" 
# 向list中添加值,方法1:
list="$list 6 7 8"
# 向list中添加值,方法2:
list=$list" 9 10"
# 引用变量时需在变量名前加“$”
for num in $list
doecho "num : $num"
done# ----------------------------------------------------------
# 6.1 从命令读取值(cat)
# 在本脚本同级目录下创建01test.txt,并写入以下内容:
# apple banana orange
# dog cat 
# book
# 同级目录下直接将文件名赋值给变量filename
# 否则需要使用绝对路径
filename=01test.txt
# cat命令用于读取文件01test.txt内容,并返回一个字串列表
for word in `cat $filename`
doecho "word : $word"
done# ----------------------------------------------------------
# 6.2 从命令读取值(ls)
# ls命令用于列出当前目录下的文件和文件夹
# 除了 ls 、cat 命令外,还可以使用 find 和 grep 等命令
for file in `ls`
doecho "word : $file"
done# ----------------------------------------------------------
# 7.1 更改字段分隔符
# 测试6.1时会发现打印内容为6行,而不是3行,
# 其原因为默认情况下 bash shell 会将空格、制表符、换行符作为分隔符
# 分隔符是特殊的环境变量 IFS (内部字段分隔符,internal field separator)
# 若想分类打印6.1的内容,需要更改字段分隔符:将IFS的值更改为换行符
filename=01test.txt
# 更改字段分隔符为换行符
IFS=$'\n'
for word in `cat $filename`
doecho "word : $word"
done# ----------------------------------------------------------
# 7.2 更改字段分隔符并还原
# 示例7.1中,修改IFS值后,该脚本的其他地方将沿用该值,该操作存在问题
# 例如在同一脚本中可能处理多个文件,这些文件的分隔符可能不同
# 为避免上述问题发生,可在修改前先保存原IFS值,用完后再改回来
# 保存原IFS值
IFS_OLD=$IFS
filename=01test.txt
# 更改字段分隔符为换行符
IFS=$'\n'
for word in `cat $filename`
doecho "word : $word"
done
# 改回原IFS值
IFS=$IFS_OLD# 可指定多个IFS字符,示例如下
IFS=$'\n':;*
# 该赋值会将换行符、冒号、分号和星号作为字段分隔符
3 while循环
#!/bin/bash# ----------------------------------------------------------
# 1 while 的基本格式
num=5
# -gt : great than 大于
while [ $num -gt 0 ] 
doecho "num : $num"num=$[$num-1]         # 法1:使用“$[]”进行数学运算# num=`expr $num - 1` # 法2:使用“expr”命令进行数学运算
done# ----------------------------------------------------------
# 2 使用多个测试命令
# while语句行可定义多个测试命令
# 每个测试命令都出现在单独的一行上
# 只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环
num=5
# -ge : great equal 大于等于
while echo $num [ $num -ge 0 ] 
do echo "num : $num" num=$[ $num - 1 ] 
done
4 until循环
#!/bin/bash# ----------------------------------------------------------
# 1 使用多个测试命令
# until语句行可定义多个测试命令
# 每个测试命令都出现在单独的一行上
# 只有测试命令的退出状态码不为0才会执行循环中列出的命令
# 下述示例中,当num=5时,
# [ $num -eq 0 ]不成立,退出状态码不为0,执行循环中的命令
# 当num=0时,[ $num -eq 0 ]成立,退出状态码为0,退出循环
num=5
until echo $num [ $num -eq 0 ] 
do echo "num : $num" num=$[ $num - 1 ]
done
5 嵌套循环
#!/bin/bash# ----------------------------------------------------------
# 1 示例1
for (( a = 1; a <= 3; a++ )) 
do echo "a : $a ----" for (( b = 1; b <= 3; b++ )) do echo "b : $b" done 
done# ----------------------------------------------------------
# 2 示例2
num1=3
while [ $num1 -ge 0 ] 
do echo "num1 : $num1 ---" for (( num2 = 1; $num2 <= 3; num2++ )) doecho "num2 : $num2" done num1=$[ $num1 - 1 ] 
done
6 循环控制
#!/bin/bash# ----------------------------------------------------------
# 1 break 命令跳出单层循环
for i in 1 2 3 4 5
doecho "i : $i"if [ $i -eq 3 ]thenbreakfi
done# ----------------------------------------------------------
# 2 break n 命令跳出多层循环
# 若不指定n,则默认跳出1层循环
for (( i = 1; i <= 5; i++ )) # 第 3 层循环
doecho "i : $i ---"for (( j = 1; $j <= 5; j++ )) # 第 2 层循环doecho "j : $j --"for ((k = 1; $k <= 5; k++)) # 第 1 层循环doecho "k : $k"if [ $k -eq 2 ]thenbreak 2 # 跳出第 2 层循环fidonedone
done# ----------------------------------------------------------
# 3 continue 命令结束当前循环
for i in 1 2 3 4 5
doif [ $i -eq 3 ] # 若i=3,则结束当前循环(不再打印 i : 3)thencontinuefiecho "i : $i"
done# ----------------------------------------------------------
# 4 continue n 命令结束指定循环
# 若不指定n,则默认结束1层循环
for (( i = 1; i <= 5; i++ )) # 第 3 层循环
doecho "i : $i ---"for (( j = 1; $j <= 5; j++ )) # 第 2 层循环doecho "j : $j --"for ((k = 1; $k <= 5; k++)) # 第 1 层循环doecho "k : $k"if [ $k -eq 2 ]thencontinue 2 # 结束第 2 层循环fidonedone
done

【a】 本文部分内容参考自《Linux命令行与shell脚本编程大全 (第3版)》第13章

相关文章:

bash shell笔记——循环结构

0 引言 本文主要介绍linux bash shell循环结构的基本使用 1 测试环境 查看系统版本&#xff1a; uname -a : Ubuntu 18.04 查看bash版本&#xff1a; bash -version : GNU bash, version 4.4.20(1)-release 创建.sh文件&#xff1a; vim 00test.sh 修改00test.sh权限&…...

rpx和px混用方案

&#xff08;1&#xff09;创建一个全局的样式配置文件&#xff1a; // styles/variables.scss :root {// 基础字体大小--font-size-xs: 12px;--font-size-sm: 14px;--font-size-md: 16px;--font-size-lg: 18px;// 响应式间距--spacing-xs: 5px;--spacing-sm: 10px;--spacing-…...

解释下SpringBoot中的服务、依赖项、微服务、分布式的概念和关系

在Spring Boot中&#xff0c;服务、依赖项、微服务和分布式是常见的概念&#xff0c;它们之间的关系如下&#xff1a; 1. 服务&#xff08;Service&#xff09; 定义&#xff1a;服务是应用程序中处理业务逻辑的组件&#xff0c;通常封装了特定的功能。作用&#xff1a;服务层…...

机器视觉--Halcon变量的创建与赋值

一、引言 在机器视觉领域&#xff0c;Halcon 作为一款强大且功能丰富的软件库&#xff0c;为开发者提供了广泛的工具和算子来处理各种复杂的视觉任务。而变量作为程序中存储和操作数据的基本单元&#xff0c;在 Halcon 编程中起着至关重要的作用。正确地创建和赋值变量是编写高…...

ES常用查询

根据编号查询 GET custom/_search { "query": { "term": { "no": "abc" } } } 查询指定的列 GET custom/_search { "_source": ["id", "no"], "size": 10000, …...

数据库与表的基本操作

创建订货管理系统数据库。数据库名称为Ordering&#xff0c;其数据文件的逻辑名称为Ordering_Data&#xff0c;存放在C盘的Order文件夹下&#xff1b;日志文件的逻辑名称为Ordering_Log&#xff0c;存放在C盘的Order文件夹下。数据库中包含数据表&#xff0c;分别为数据表C&…...

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter12-BOM

十二、BOM 虽然 ECMAScript 把浏览器对象模型&#xff08;BOM&#xff0c;Browser Object Model&#xff09;描述为 JavaScript 的核心&#xff0c;但实际上 BOM 是使用 JavaScript 开发 Web 应用程序的核心。BOM 提供了与网页无关的浏览器功能对象。 HTML5 规范中有一部分涵盖…...

03【FreeRTO队列-如何获取任务信息与队列的动静态创建】

一.利用 vTaskList()以及 vTaskGetRunTimeStats()来获取任务的信息 1.现象与开启启用宏 freeRTOSConfig.h //必须启用 #define configUSE_TRACE_FACILITY 1 #define configGENERATE_RUN_TIME_STATS 1 #define configUSE_STATS_FORMATTING_FUNCTIONS…...

GBD研究——美国州级地图(附资源)

美国州级别地图 地图源很多&#xff0c;随便下载。不过我试了两个资源&#xff0c;发现有的资源会漏掉阿拉斯加和夏威夷。 就剩大的这块佩奇 出现这样的问题&#xff0c;要么跟数据源有关&#xff0c;要么就是要掉地名来看&#xff0c;是不是没匹配上。 亲自试过&#xff0c…...

【微服务学习一】springboot微服务项目构建以及nacos服务注册

参考链接 3. SpringCloud - 快速通关 springboot微服务项目构建 教程中使用的springboot版本是3.x&#xff0c;因此需要使用jdk17&#xff0c;并且idea也需要高版本&#xff0c;我这里使用的是IDEA2024。 环境准备好后我们就可以创建springboot项目&#xff0c;最外层的项目…...

第39周:猫狗识别 2(Tensorflow实战第九周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 再次检查数据 2.3 配置数据集 2.4 可视化数据 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 四、编译 五、训练模型 5.1 上次程序的主要Bug 5.2 修改版…...

【Elasticsearch源码解读】代码包结构概述

Elasticsearch的代码库包含多个包&#xff0c;每个包负责不同的功能。以下是这些包的主要功能&#xff1a; #### action 封装了Elasticsearch的各种操作&#xff0c;如索引、搜索、删除等&#xff0c;提供了与集群交互的接口。 #### bootstrap 包含启动Elasticsearch节点所…...

DeepSeek 概述与本地化部署【详细流程】

目录 一、引言 1.1 背景介绍 1.2 本地化部署的优势 二、deepseek概述 2.1 功能特点 2.2 核心优势 三、本地部署流程 3.1 版本选择 3.2 部署过程 3.2.1 下载Ollama 3.2.2 安装Ollama 3.2.3 选择 r1 模型 3.2.4 选择版本 3.2.5 本地运行deepseek模型 3.3.6 查看…...

jenkins war Windows安装

Windows安装Jenkins 需求1.下载jenkins.war2.编写快速运行脚本3.启动Jenkins4.Jenkins使用 需求 1.支持在Windows下便捷运行Jenkins&#xff1b; 2.支持自定义启动参数&#xff1b; 3.有快速运行的脚步样板。 1.下载jenkins.war Jenkins下载地址&#xff1a;https://get.j…...

【NLP251】命名实体识别常用模块(基于Transformer分类)

1. 从JSON格式的数据中加载并预处理样本供Ner任务训练和推理使用 class JsonNerDataset(Dataset):"""定义一个加载json格式原始命名实体识别格式数据的Dataset一行一条样本(json字符串)&#xff0c;包含: originalText、entities"""def __init_…...

3D打印技术:如何让古老文物重获新生?

如何让古老文物在现代社会中焕发新生是一个重要议题。传统文物保护方法虽然在一定程度上能够延缓文物的损坏&#xff0c;但在文物修复、展示和传播方面仍存在诸多局限。科技发展进步&#xff0c;3D打印技术为古老文物的保护和传承提供了全新的解决方案。我们来探讨3D打印技术如…...

基于python sanic框架,使用Nacos进行微服务管理

微服务软件系统构建方式,已经很普及了,通过开源的sanic进行微服务管理,便捷,技术也比较成熟,而在项目实际应用过程中,微服务类型不仅有java的,还有nodejs、python等,尤其是结合算法模型构建的python接口,需要在Nacos进行注册管理。本文内容耗时2天踏坑,亲测一切ok。 …...

Vue h函数到底是个啥?

h 到底是个啥&#xff1f; 对于了解或学习Vue高阶组件&#xff08;HOC&#xff09;的同学来说&#xff0c;h() 函数无疑是一个经常遇到的概念。 那么&#xff0c;这个h() 函数究竟如何使用呢&#xff0c;又在什么场景下适合使用呢&#xff1f; 一、h 是什么 看到这个函数你可…...

深入浅出 Python Logging:从基础到进阶日志管理

在 Python 开发过程中&#xff0c;日志&#xff08;Logging&#xff09;是不可或缺的调试和监控工具。合理的日志管理不仅能帮助开发者快速定位问题&#xff0c;还能提供丰富的数据支持&#xff0c;让应用更具可观测性。本文将带你全面了解 Python logging 模块&#xff0c;涵盖…...

Android WindowContainer窗口结构

Android窗口是根据显示屏幕来管理&#xff0c;每个显示屏幕的窗口层级分为37层&#xff0c;0-36层。每层可以放置多个窗口&#xff0c;上层窗口覆盖下面的。 要理解窗口的结构&#xff0c;需要学习下WindowContainer、RootWindowContainer、DisplayContent、TaskDisplayArea、T…...

创建一个新的 React Native 项目

之前一直使用 npx react-native init my_app 来创建 RN 项目, 但是新版本会报错: Need to install the following packages: react-native0.77.0 Ok to proceed? (y) y npm ERR! code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving: unde…...

Linux vmstat 命令

作用 性能监控工具。 示例 vmstat 2 5&#xff1a;每 2 秒执行 1 次&#xff0c;共执行 5 次。 下列示例中加了 -w 80 参数增加显示长度&#xff0c;目的是对齐字段值&#xff0c;Ctrl C 可停止输出。 [rootlocalhost ~]# vmstat 2 -w 80 procs -----------------------me…...

2025年最新版1688平台图片搜索接口技术指南及Python实现

随着电商行业的蓬勃发展&#xff0c;1688作为国内领先的B2B交易平台&#xff0c;其商品搜索功能对于买家和卖家而言都至关重要。图片搜索作为其中的一种高级搜索方式&#xff0c;能够极大地提升用户的搜索体验和准确性。本文将详细介绍如何通过API接口实现1688平台的图片搜索功…...

基于A*算法与贝塞尔曲线的路径规划与可视化:从栅格地图到平滑路径生成

引言 在机器人导航、自动驾驶和游戏开发等领域,路径规划是一个核心问题。如何高效地找到从起点到终点的最优路径,并且确保路径的平滑性和安全性,是许多应用场景中的关键挑战。本文将介绍一种结合A算法和贝塞尔曲线的路径规划方法,并通过Pygame实现可视化。我们将从栅格地图…...

使用verilog 实现 cordic 算法 ----- 旋转模式

1-设计流程 ● 了解cordic 算法原理&#xff0c;公式&#xff0c;模式&#xff0c;伸缩因子&#xff0c;旋转方向等&#xff0c;推荐以下链接视频了解 cordic 算法。哔哩哔哩-cordic算法原理讲解 ● 用matlab 或者 c 实现一遍算法 ● 在FPGA中用 verilog 实现&#xff0c;注意…...

【css】width:100%;padding:20px;造成超出100%宽度的解决办法 - box-sizing的使用方法 - CSS布局

问题 修改效果 解决方法 .xx {width: 100%;padding: 0 20px;box-sizing: border-box; } 默认box-sizing: content-box下&#xff0c; width 内容的宽度 height 内容的高度 宽度和高度的计算值都不包含内容的边框&#xff08;border&#xff09;和内边距&#xff08;padding&…...

贪心算法_翻硬币

蓝桥账户中心 依次遍历 不符合条件就反转 题目要干嘛 你就干嘛 #include <bits/stdc.h>#define endl \n using namespace std;int main() {ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); string s; cin >> s;string t; cin >> t;int ret 0;for ( i…...

vue开发06:前端通过webpack配置代理处理跨域问题

1.定义 在浏览器尝试请求不同源&#xff08;域名、协议、端口号不同&#xff09;的资源时&#xff0c;浏览器的同源策略会阻止这种跨域请求。&#xff08;比如前端端口15500&#xff0c;后端端口5050&#xff0c;前端界面不可以直接调用5050端口&#xff09; 2.解决方案 使用前…...

深入HBase——引入

引入 前面我们通过深入HDFS到深入MapReduce &#xff0c;从设计和落地&#xff0c;去深入了解了大数据最底层的基石——存储与计算是如何实现的。 这个专栏则开始来看大数据的三驾马车中最后一个。 通过前面我们对于GFS和MapReduce论文实现的了解&#xff0c;我们知道GFS在数…...

2025年02月12日Github流行趋势

项目名称&#xff1a;data-formulator 项目地址url&#xff1a;https://github.com/microsoft/data-formulator 项目语言&#xff1a;TypeScript 历史star数&#xff1a;4427 今日star数&#xff1a;729 项目维护者&#xff1a;danmarshall, Chenglong-MS, apps/dependabot, mi…...