shell编程(8)
目录
一、until循环
示例
until 和 while 的区别
二、case语句
基本语法
示例
1. 简单的 case 语句
2. 使用通配符
3. 处理多个匹配
case 和 if 的比较
case 语句:
if 语句:
三、基本函数
基本函数定义和调用
1. 定义一个简单的函数
2. 函数接收参数
3. 返回值
4. 使用 return 返回状态码
5. 局部变量和全局变量
6. 函数的递归调用
7. 函数中的错误处理
8. 函数的默认参数
声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章
声明:本文主要用作技术分享,所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险,并遵循相关法律法规。
一、until循环
在Shell编程中,until
循假 时执行循环体。
bash复制代码until [ 条件 ] do# 循环体 d done ``
until
循环会
示例
-
基本例子: 打印数字
count
达到 5。
bash复制代码count=1 until [ $count -gt 5 ] doecho $count((count++)) ((co ( done
解释:
-
循环开始时,
count
的值为 1。 -
条件是
count -gt 5
,即count
是否大于 5。当count
小于或等于 5 时,循环体继续执行。 -
每次循环后,
count
会增加 1。
输出结果:
复制代码1 2 3 4 5
-
判断文件是否存在:直到文件存在时退出。
bash复制代码until [ -f /path/to/file ] doecho "文件还不存在,等待中..."sleep 2 done echo "文件已存在,继续执行"
解释:
-
每隔 2 秒检查一次文件是否存在,直到文件存在时,退出循环。
until
和 while
的区别
-
until
循环是当条件为假时才执行,而while
循环是当条件为真时才执行。
例如:
bash复制代码# while 例子:当条件为真时执行 while [ $count -lt 5 ] doecho $count((count++)) done # until 例子:当条件为假时执行 count=1 until [ $count -gt 5 ] doecho $count((count++)) done
二、case语句
基本语法
bash复制代码case 变量 inpattern1)# 当变量匹配 pattern1 时执行的命令;;pattern2)# 当变量匹配 pattern2 时执行的命令;;*)# 默认情况,如果变量不匹配任何模式时执行的命令;; esac
-
变量
是你要检查的变量。 -
pattern1
,pattern2
等是模式,可以是文字、通配符(例如*
)或正则表达式。 -
;;
用于结束每个匹配的执行块。 -
*
是一个通配符,表示所有其他没有匹配的情况,相当于default
。
示例
1. 简单的 case
语句
bash复制代码echo "请输入一个数字:" read num case $num in1)echo "你输入的是数字 1";;2)echo "你输入的是数字 2";;3)echo "你输入的是数字 3";;*)echo "你输入的不是 1, 2 或 3";; esac
解释:
-
程序提示用户输入一个数字,然后根据输入的值匹配不同的模式。
-
如果输入的是 1,2 或 3,程序会分别输出相应的信息;否则输出默认信息。
2. 使用通配符
bash复制代码echo "请输入一个文件名:" read filename case $filename in*.txt)echo "这是一个文本文件";;*.jpg | *.png)echo "这是一个图片文件";;*)echo "无法识别的文件类型";; esac
解释:
-
这个示例中,
case
语句根据文件名的扩展名来判断文件类型。 -
如果文件名以
.txt
结尾,输出“这是一个文本文件”;如果是.jpg
或.png
,则输出“这是一个图片文件”;其他文件类型则输出“无法识别的文件类型”。
3. 处理多个匹配
bash复制代码echo "请输入一个字符:" read char case $char in[a-z])echo "你输入的是一个小写字母";;[A-Z])echo "你输入的是一个大写字母";;[0-9])echo "你输入的是一个数字";;*)echo "你输入的不是字母或数字";; esac
解释:
-
case
语句根据用户输入的字符进行分类。 -
[a-z]
匹配小写字母,[A-Z]
匹配大写字母,[0-9]
匹配数字。
case
和 if
的比较
case
语句的优势在于它能简洁地处理多种条件,而 if
语句通常用于两种条件或逻辑较为复杂的情况。对于多重条件判断,case
语句通常更加清晰和简洁。
例如,以下两种写法是等价的:
case
语句:
bash复制代码case $color inred)echo "红色";;blue)echo "蓝色";;green)echo "绿色";;*)echo "未知颜色";; esac
if
语句:
bash复制代码if [ "$color" = "red" ]; thenecho "红色" elif [ "$color" = "blue" ]; thenecho "蓝色" elif [ "$color" = "green" ]; thenecho "绿色" elseecho "未知颜色" fi
三、基本函数
基本函数定义和调用
在 Shell 中,函数的基本语法如下:
bash复制代码function 函数名 {# 函数体# 这里放你希望执行的命令 } # 或者简化版本 函数名() {# 函数体 }
1. 定义一个简单的函数
bash复制代码my_function() {echo "Hello, World!" } # 调用函数 my_function
解释:
-
my_function
是函数名,函数体中只有一个echo
命令用于输出 "Hello, World!"。 -
调用时,只需写出函数名
my_function
即可执行该函数。
2. 函数接收参数
函数可以通过 $1
, $2
, $3
, 等来接收参数,表示调用时传入的值。
bash复制代码greet() {echo "Hello, $1!" } greet "Alice" # 输出:Hello, Alice! greet "Bob" # 输出:Hello, Bob!
解释:
-
函数
greet
接收一个参数$1
,并将其用于输出欢迎信息。 -
你可以在函数调用时传递参数,
$1
就是第一个传入的值。
3. 返回值
在 Shell 函数中,并不像其他编程语言那样直接通过 return
返回值,return
通常用于返回一个状态码(0 表示成功,非0 表示失败)。如果需要返回实际值,可以通过 echo
来实现。
bash复制代码add_numbers() {local sum=$(( $1 + $2 )) # local 用于局部变量echo $sum } result=$(add_numbers 5 3) # 调用函数并将返回值赋给变量 echo "Result: $result" # 输出:Result: 8
解释:
-
add_numbers
函数接收两个参数并计算它们的和。 -
echo
输出和,通过$(...)
语法将其捕获并赋值给result
变量。
4. 使用 return
返回状态码
return
语句用于返回一个状态码(通常是 0 或非零的整数),可以用来表示函数执行的成功或失败。
bash复制代码check_number() {if [ $1 -lt 0 ]; thenreturn 1 # 返回非0,表示失败elsereturn 0 # 返回0,表示成功fi } check_number -5 if [ $? -eq 0 ]; thenecho "输入的是一个非负数" elseecho "输入的是一个负数" fi
解释:
-
check_number
函数检查传入的数字是否为负数。 -
使用
return
返回一个状态码,$?
用于检查函数的返回值。如果是 0,表示函数执行成功;如果是非 0,表示失败。
5. 局部变量和全局变量
在 Shell 中,变量默认是全局的,可以在函数外部访问。在函数内部,若希望定义局部变量,可以使用 local
关键字。
bash复制代码function test_vars() {local var1="local variable" # 局部变量var2="global variable" # 全局变量echo "Inside function: $var1"echo "Inside function: $var2" } var2="This is global" test_vars echo "Outside function: $var2" # 输出全局变量
解释:
-
local
关键字用于定义局部变量var1
,该变量仅在函数内部有效。 -
var2
是全局变量,可以在函数外部访问。
6. 函数的递归调用
Shell 函数支持递归调用,即函数在其内部调用自己。注意要有结束条件,以避免无限递归。
bash复制代码factorial() {if [ $1 -le 1 ]; thenecho 1elselocal result=$(( $1 * $(factorial $(( $1 - 1 ))) ))echo $resultfi } result=$(factorial 5) echo "5的阶乘是:$result" # 输出:5的阶乘是:120
解释:
-
factorial
函数计算一个数字的阶乘。 -
当输入小于或等于 1 时,返回 1;否则,递归调用自己并计算阶乘。
7. 函数中的错误处理
在函数中进行错误处理时,可以通过检查命令的退出状态码或使用 set -e
来中止脚本。
bash复制代码divide() {if [ $2 -eq 0 ]; thenecho "Error: Division by zero is not allowed!"return 1 # 返回错误码filocal result=$(( $1 / $2 ))echo $result } result=$(divide 10 0) if [ $? -ne 0 ]; thenecho "发生错误,不能除以零" elseecho "结果是:$result" fi
解释:
-
divide
函数检查是否发生了除零错误。 -
如果第二个参数为 0,则返回错误码并输出错误信息。
8. 函数的默认参数
Shell 函数也可以设置默认参数,以防用户没有提供值。
bash复制代码greet() {
local name="${1:-World}" # 如果没有传递参数,则默认值为 "World"
echo "Hello, $name!"
}
greet "Alice" # 输出:Hello, Alice!
greet # 输出:Hello, World!
相关文章:
shell编程(8)
目录 一、until循环 示例 until 和 while 的区别 二、case语句 基本语法 示例 1. 简单的 case 语句 2. 使用通配符 3. 处理多个匹配 case 和 if 的比较 case 语句: if 语句: 三、基本函数 基本函数定义和调用 1. 定义一个简单的函数 2. …...
高级java每日一道面试题-2024年11月24日-JVM篇-说说对象分配规则?
如果有遗漏,评论区告诉我进行补充 面试官: 说说对象分配规则? 我回答: 在Java高级面试中,对象分配规则是一个核心考点,它涉及到JVM的内存管理、对象的创建和初始化等多个方面。以下是对Java对象分配规则的详细解释: 一、内存分配区域 J…...

进程间通信5:信号
引入 我们之前学习了信号量,信号量和信号可不是一个东西,不能混淆。 信号是什么以及一些基础概念 信号是一种让进程给其他进程发送异步消息的方式 信号是随时产生的,无法预测信号可以临时保存下来,之后再处理信号是异步发送的…...
性能测试及调优
一、性能测试介绍 1、什么叫做性能测试? (1)通过某些工具或手段来检测软件的某些指标是否达到了要求,这就是性能测试 (2)指通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指…...

实战基于LangChain和ChatGLM私有化部署聊天机器人
本文主要阐述了如何使用第二代6B模型进行对话训练,以及如何通过微调来提高大模型的性能。文中提到了在8501端口上启动第二代6B模型,并使用极简模板进行请求。与第一代模型相比,第二代6B模型具有更强的对话能力,并且可以通过微调来…...

利用adb工具安装卸载安卓平板(手机)软件
参考链接: 1、ADB 操作命令详解及用法大全 2、全面掌握Android调试工具箱:ADB与实用程序实战 平时使用小米手机没有感觉,miui系统做的确实好。最近买了个水货学习系统平板(主要看重硬件配置,性价比很高,但…...

基于docker进行任意项目灵活发布
引言 不管是java还是python程序等,使用docker发布的优势有以下几点: 易于维护。直接docker命令进行管理,如docker stop、docker start等,快速方便无需各种进程查询关闭。环境隔离。项目代码任何依赖或设置都可以基本独立&#x…...

Datatables:监听行内文本框,进行行内数据修改;计算行总和
一、监听行内文本框,进行行内数据修改 效果 修改数量、单价会自动计算金额(金额数量*单价) 实现 1、增加行的class 2、数据监听、修改数值 "initComplete": function() {// 监听数量和单价输入框的变化$(document).on(input, .…...

对于某些原型或UI软件的个人看法(2024/11)
由于我这几天,一边敲代码,一边进行页面布局设计与编码,发现可能就一个卡片,我都得调很久样式,觉得这样改很累也没效率,页面也不是很美观。所以我想到了ui设计,我可以先进行ui设计,然…...

嵌入式硬件实战提升篇(二)PCB高速板设计 FPGA核心板带DDR3 PCB设计DDR全面解析
引言:设计一款高速板,供读者学习,FPGA核心板,带一颗DDR3内存,FPGA型号:XC6SLX16-2FTG256C。 随着嵌入式硬件技术的快速发展,高速板设计逐渐成为嵌入式系统设计中的核心技术之一。高速板的设计要…...

亚信安全携手飞书“走近先进” 与保隆科技探索制造业数字化转型
亚信安全携手飞书组织举办“走近先进”活动。近日活动“走近”了中国汽车供应链百强、上海市制造业五十强企业——上海保隆汽车科技股份有限公司(以下简称“保隆科技”)。活动围绕“突破桎梏 加速升级”的主题,聚焦企业数字化转型的核心议题&…...
【C++篇】排队的艺术:用生活场景讲解优先级队列的实现
文章目录 须知 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗࿱…...

VTK的基本概念(一)
文章目录 三维场景的基本要素1.灯光2.相机3.颜色4.纹理映射 三维场景的基本要素 1.灯光 在三维渲染场景中,可以有多个灯光的存在,灯光和相机是三维渲染场景的必备要素,如果没有指定的话,vtkRenderer会自动创建默认的灯光和相机。…...
error LNK2001: 无法解析的外部符号 memcpy strcmp strlen
0>LIBMY_static.lib(pixdesc.obj) : error LNK2001: 无法解析的外部符号 __imp_abort 10>LIBMY_static.lib(random_seed.obj) : error LNK2001: 无法解析的外部符号 __imp_abort 10>postprocess.obj : error LNK2001: 无法解析的外部符号 __imp_abort 10>LIBMY_sta…...
打造智能扩容新纪元:Kubernetes Custom Metrics深度解析
自定义指标:Kubernetes Auto Scaling的革命 1. 引言 1.1 Kubernetes与Auto Scaling Kubernetes作为当今容器编排的事实标准,提供了强大的自动化能力,其中Auto Scaling(自动扩缩容)是其核心特性之一。Auto Scaling允许Kubernetes集群根据当前负载动态调整资源,以应对不…...

【K8s】专题十五(4):Kubernetes 网络之 Calico 插件安装、切换网络模式、卸载
本文内容均来自个人笔记并重新梳理,如有错误欢迎指正! 如果对您有帮助,烦请点赞、关注、转发、订阅专栏! 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】(全…...

Unity类银河战士恶魔城学习总结(P141 Finalising ToolTip优化UI显示)
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ UI部分暂时完结!!! 本章节优化了UI中物品描述的显示效果,技能描述的显示效果 并且可以批…...
c++(入门)
1. 引用 引用的定义 引用是另一个变量的别名,它在声明时必须被初始化,并且一旦初始化后,它就始终引用那个变量。 引用的语法 引用的声明方式是在变量名前加上&符号。 引用的特点 引用必须在声明时初始化。引用一旦初始化后&#x…...

【优选算法】前缀和
目录 一、[【模板】前缀和](https://www.nowcoder.com/practice/acead2f4c28c401889915da98ecdc6bf?tpId230&tqId2021480&ru/exam/oj&qru/ta/dynamic-programming/question-ranking&sourceUrl%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595…...

Spring Bean 的生命周期详解
所谓万物皆对象,对于一个 bean 而言,从出生到死亡,他要经历哪些阶段呢? 生命周期 理解对象的生命周期,可以帮助我们更好的做一些扩展。 一个对象从被创建到被垃圾回收,可以大致分为这 5 个阶段:…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...