一.Shell 函数的基本概念
和其他编程语言(比如 Python、Java)的函数一样,Shell 函数的核心目的是:
代码复用:把重复执行的逻辑封装成函数,调用即可,不用反复写相同代码;
代码模块化:把复杂脚本拆分成多个小函数,每个函数负责一个独立功能,脚本结构更清晰,便于维护;
简化调试:出问题时只需定位到对应的函数,不用在冗长的脚本里逐行找。
函数的用法
语法:
[function] 函数名(){
命令序列
[return x]
}
function:关键字表示定义一个函数,可以省略
({):表示函数执行命令的入口,该符号可以与函数名同行也可以在函数名下一行的句首
(}):表示函数体结束,两个大括号之间{ }是函数体
命令序列:部分可以是任意的Shell命令,也可以调用其他函数
return:表示退出函数返回一个推出值,通过返回值判断执行是否成功。也可以使用exit终止整个shell脚本
例如1:
两个数求和:
1.运行脚本后,先看到 请输入第一个数: → 你输入 2(存到 num1 )。
2.接着 请输入第二个数: → 你输入 3(存到 num2 )。
3.脚本检查两个数都是纯数字,合法。
4.然后计算 2+3=5,输出:
你输入的两个数为: 2 和 3.
两个数的和为: 5




例如2:
系统资源监控并报警函数



参数说明:函数接受三个参数,分别是CPU使用率值、内存使用率阈值以及监控间隔时间(秒)
循环监控:使用while true循环不断监控系统资源,通过top和free命令获取cpu和内存使用率,使用bc命令进行浮点数比较
报警处理:当使用超过阈值时,调用dend_alert函数发送报警信息
二、函数的参数传递与接收
Shell 函数没有形参定义,通过位置参数接收外部传入的值,规则和脚本的位置参数一致:
| $1-$9 | 接收第 1 到第 9 个传入参数 |
| ${10} | 接收第 10 个及以上参数(必须加花括号) |
| $# | 传入参数的总个数 |
| $@ | 所有传入参数(逐个独立) |
| $* | 所有传入参数(整体字符串) |
示例:带参数的函数
函数变量的作用范围
在shell脚本中函数的执行并不会来气一个新的的子Shell,而是仅在当前定义的shell环境中有效
函数的参数
用法:
函数名称 参数1 参数2 参数3 ……
例如:


递归函数
例如:


三.总结
1. Shell 函数核心用途是封装可复用代码,定义有 函数名() 和 function 函数名() 两种方式,调用直接写函数名即可。
2. 参数通过 $1/$2/$# 等位置变量接收,返回值分两种场景:return 返回复状态(0-255),echo 返回数据(字符串 / 大数)。
3. 关键技巧:用 local 定义局部变量、通过 source 导入通用函数、避免函数名与系统命令重名
四.Shell数组
数组的定义方法:
方法一:
数组名=(value0 value1 value2)

获取数组长度
查看数组长度: ${#数组名[*]}(合并所有元素,等同于传入一个包含所有元素的字符串)
查看数组内容:${#数组名[@]}(保留元素独立性,等同于分别传入每个元素)
例如:

![]()
读取某下标赋值


数组遍历


数组切片
语法:
${array[@]:start:length }
start:开始的索引
length:要提取的元素个数
例如:



数组替换
例如:




数组删除
例如:



五.Shell脚本调试
语法:
sh [-nvx] 脚本名
-n:不会执行脚本,仅查询脚本语法是否有问题,如果没有语法文图就不显示任何内容、如果有问题会提示报错
-v:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错,则会给出错误提示
-x:将执行的脚本内容输出到屏幕上,这是对调试很有用的参数
例如:



