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章

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

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

相关文章

Word成功接入DeepSeek详细步骤

原理 原理是利用Word的VBA宏&#xff0c;写代码接入API。无需下载额外插件。 步骤一、注册硅基流动 硅基流动统一登录 注册这个是为了有一个api调用的api_key&#xff0c;有一些免费的额度可以使用。大概就是这个公司提供token&#xff0c;我们使用这个公司的模型调用deepsee…

vue-点击生成动态值,动态渲染回显输入框

1.前言 动态点击生成数值&#xff0c;回显输入框&#xff0c;并绑定。 2.实现 <template><div style"display:flex;align-items: center;flex-direction:row"><a-input:key"inputKey"v-model"uploadData[peo.field]"placehold…

Python 识别图片和扫描PDF中的文字

目录 工具与设置 Python 识别图片中的文字 Python 识别图片中的文字及其坐标位置 Python 识别扫描PDF中的文字 注意事项 在处理扫描的PDF和图片时&#xff0c;文字信息往往无法直接编辑、搜索或复制&#xff0c;这给信息提取和分析带来了诸多不便。手动录入信息不仅耗时费…

利用邮件合并将Excel的信息转为Word(单个测试用例转Word)

利用邮件合并将Excel的信息转为Word 效果一览效果前效果后 场景及问题解决方案 一、准备工作准备Excel数据源准备Word模板 二、邮件合并操作步骤连接Excel数据源插入合并域预览并生成合并文档 效果一览 效果前 效果后 场景及问题 在执行项目时的验收阶段&#xff0c;对于测试…

进阶版MATLAB 3D柱状图

%% 1. 数据准备 % 假设数据是一个任意形式的矩阵 % 例如&#xff1a;5行 x 7列的矩阵 data [3 5 2 6 8 4 7;7 2 6 9 3 5 8;4 8 3 7 2 6 9;6 1 5 8 4 7 2;9 4 7 3 6 2 5];% 定义行和列的标签&#xff08;可选&#xff09; rowLabels {Row1, Row2, Row3, Row4, Row5}; % 行标签…

【JVM详解三】垃圾回收机制

一、对象是否存活 强引用&#xff1a;Object obj new Object(); 只要强引用还在&#xff0c;垃圾收集器永远不会回收掉被引用的对象。在不用对象的时将引用赋值为 null&#xff0c;能够帮助垃圾回收器回收对象。比如 ArrayList 的 clear() 方法实现。软引用&#xff08;SoftRe…

【免费】2007-2020年各省医疗卫生支出数据

2007-2020年各省医疗卫生支出数据 1、时间&#xff1a;2007-2020年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区名称、年份、医疗卫生支出 4、范围&#xff1a;31省 5、指标说明&#xff1a;地方财政医疗卫生支出是指地方ZF从其财政预…

【深度学习入门实战】基于Keras的手写数字识别实战(附完整可视化分析)

​ 本人主页:机器学习司猫白 ok,话不多说,我们进入正题吧 项目概述 本案例使用经典的MNIST手写数字数据集,通过Keras构建全连接神经网络,实现0-9数字的分类识别。文章将包含: 关键概念图解完整实现代码训练过程可视化模型效果深度分析环境准备 import numpy as np impo…

腾讯云大数据套件TBDS与阿里云大数据能力产品对比

前言 博主在接触大数据方向研究的时候是在2016年,那时候正是大数据概念非常火热的一个时间段,最著名的Google的3篇论文。Google FS、MapReduce、BigTable,奠定了大数据框架产品的基础。Google文件系统,计算框架和存储框架。往后所有的大数据产品和过程域无一不是在三个模块…

前端如何判断浏览器 AdBlock/AdBlock Plus(最新版)广告屏蔽插件已开启拦截

2个月前AdBlock/AdBlock Plus疑似升级了一次 因为自己主要负责面对海外的用户项目&#xff0c;发现以前的检测AdBlock/AdBlock Plus开启状态方法已失效了&#xff0c;于是专门研究了一下。并尝试了很多方法。 已失效的老方法 // 定义一个检测 AdBlock 的函数 function chec…

2.11寒假作业

web&#xff1a;[SWPUCTF 2022 新生赛]js_sign 打开环境是这样的&#xff0c;随便输入进行看看 提示错误&#xff0c;看源码其中的js代码 这个代码很容易理解&#xff0c;要让输入的内容等于对应的字符串&#xff0c;显然直接复制粘贴是错的 这串字符看起来像是base64加密&…

c# http

C#代码 客户端&#xff1a; NETCore提供了三种不同类型用于生产的REST API&#xff1a; HttpWebRequest;WebClient;HttpClient HttpWebRequest 这是.NET创建者最初开发用于使用HTTP请求的标准类。使用HttpWebRequest可以让开发者控制请求/响应流程的各个方面&#xff0c;如…

哈希表实现(C++实现)

目录 1.哈希概念 2.哈希冲突 3.哈希函数 4.哈希冲突解决 闭散列 —— 开放定址法 线性探测 二次探测 开散列 —— 链地址法&#xff08;拉链法、哈希桶&#xff09; 5.哈希表的闭散列实现 哈希表的结构 哈希表的大小和扩容 哈希表的插入 哈希表的查找 哈希表的删除…

开箱即用:一个易用的开源表单工具!

随着互联网的普及&#xff0c;表单应用场景越来越广泛&#xff0c;从网站注册、调查问卷到考试测评&#xff0c;无处不在。传统的表单制作方式需要一定的代码基础&#xff0c;对于不懂编程的小伙伴来说&#xff0c;无疑是一道门槛。 今天&#xff0c;给大家分享一款开源的表单…

牛客 BM1: 反转链表

目录 一、题目 二、C解题程序框架 1. 结构体定义 2. 类定义 3. 输入输出说明 三、链表指针 1. 链表指针的基本概念 2. 链表指针的常见操作 1. 遍历链表 2. 插入节点 3. 删除节点 3. 链表指针操作的注意事项 4. 总结 四、解题 方法一&#xff1a;迭代法 方法二&…

MIT开源7B推理模型Satori:用行动思维链进行强化学习,增强自回归搜索

自OpenAI的o1发布以来&#xff0c;研究社区为提升开源LLM的高级推理能力做出了诸多努力&#xff0c;包括使用强大的教师模型进行蒸馏、蒙特卡洛树搜索&#xff08;MCTS&#xff09;以及基于奖励模型的引导搜索等方法。 本研究旨在探索一个新的研究方向&#xff1a;使LLM具备自回…

Kubernetes控制平面组件:etcd(一)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;kubectl 和 …

Django在终端创建项目(pycharm Windows)

1.选择目录 选择或新建一个文件夹&#xff0c;作为项目保存的地方 2.右键在终端打开 3.确定django-admin.exe安装位置 找到自己安装django时&#xff0c;django-admin.exe安装的位置&#xff0c;例如 4.运行命令 使用django-admin.exe的绝对路径&#xff0c;在刚才打开的终端…

e2studio开发RA2E1(9)----定时器GPT配置输入捕获

e2studio开发RA2E1.9--定时器GPT配置输入捕获 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback…

【PS 2022】Adobe Genuine Service Alert 弹出

电脑总是弹出Adobe Genuine Service Alert弹窗 1. 不关掉弹窗并打开任务管理器&#xff0c;找到Adobe Genuine Service Alert&#xff0c;并右键进入文件所在位置 2 在任务管理器中结束进程并将文件夹中的 .exe 文件都使用空文档替换掉 3. 打开PS不弹出弹窗&#xff0c;解决&a…