写自动化 Shell 脚本时,重复写大量相同代码会导致脚本冗长、难维护。Shell 函数就是用来封装重复逻辑,实现代码复用的核心工具。
本文完整讲解函数定义与调用、函数返回值,搭配线上日志清理、服务检测实战案例,看完就能封装自己的通用脚本工具!
一、为什么要用 Shell 函数?
1.代码复用:重复执行的逻辑只写一次函数,多处直接调用,不用复制粘贴大量代码;
2.结构清晰:按功能拆分函数,日志、备份、监控分开封装,脚本可读性大幅提升;
3.便于维护:逻辑修改只需要改函数内部一处,所有调用位置同步生效;
4.支持传参与返回值:可传入自定义参数,执行完成后返回状态 / 结果,适配复杂自动化流程。
二、函数定义与调用(基础核心)
1. 两种标准函数定义语法
写法 1:标准推荐写法(企业通用)

写法 2:带 function 关键字写法,可读性更强

2. 函数基础调用规则
1.必须先定义,后调用:函数写在脚本前面,后面代码才能调用;
2.调用时直接写函数名,不需要加括号();
3.给函数传参直接在函数名后追加参数,用法和脚本外部传参一致(2、$# 等)。
3. 最简入门示例

运行输出:

4. 实战封装:日志目录自动创建函数
日常脚本经常需要校验文件夹,封装成函数一键复用:

5. 函数内特殊参数说明
函数内部同样支持脚本内置特殊变量,只作用于本次函数调用:
变量 | 含义 |
2 | 函数调用时传入的第 1、2 个参数 |
$# | 本次调用传入参数总个数 |
$@ | 函数所有传入参数,循环遍历专用 |
$0 | 仍然代表脚本文件名,不是函数名 |
三、函数返回值两种实现方式
Shell 函数没有传统编程语言的 return 数据返回,分为状态返回值(return)、标准输出返回数据(echo)两种场景,分工完全不同。
方式 1:return 返回执行状态码(只能返回 0-255 数字)
1.规则:return 仅用于返回执行状态,0 代表执行成功,非 0 数字代表异常;
2.读取返回值:调用函数后通过$?捕获状态码;
3.限制:不能返回字符串、大数字,仅用于判断函数执行是否正常。
示例:判断文件是否存在,返回状态码

方式 2:echo 输出返回字符串 / 数字(获取函数计算结果)
如果需要函数返回字符串、路径、计算数值等业务数据,使用 echo 打印输出,通过变量=$(函数名 参数)捕获输出内容。
示例 1:返回拼接后的日志文件名

示例 2:数字计算函数,返回运算结果

两种返回方式选型区分
1.return:仅判断执行成功/ 失败,返回0-255 状态码,配合$?读取;
2.echo + $():获取函数业务结果(字符串、文件路径、计算数值),日常数据返回首选。
四、综合实战:完整自动化日志清理脚本(函数封装)
整合函数定义、传参、返回值,企业可直接上线使用

五、新手高频踩坑避坑指南
1.函数调用顺序错误:必须先写函数定义,再调用,否则会提示 command not found;
2.混淆两种返回值用法:return 不能返回字符串,想要获取文本结果只能用 echo 捕获;
3.\\函数传参混淆0 永远是脚本名,函数内部参数从 $1 开始;
4.echo多余输出干扰结果捕获:如果用$()捕获函数返回数据,函数内部不要多余 echo 打印,会混入返回变量;
5.return数值范围限制:return仅支持0~255,超过范围会出现数值错乱。
六、全文总结
1.函数核心作用:封装重复代码,实现代码复用,拆分脚本逻辑,便于维护迭代;
2.函数定义与调用:两种定义语法,先定义后调用,传参使用2/$# 等内置变量;
3.两种返回机制
○return:返回 0-255 执行状态码,$? 读取,用于判断执行成败;
○echo + $(函数):捕获字符串、数字、路径等业务数据,数据返回首选;
掌握 Shell 函数后,你可以把日志清理、服务监控、文件备份等通用逻辑全部封装成独立函数,写出结构清晰、可复用、易维护的企业级自动化脚本。
干货福利
需要我整理一份《Shell 函数通用封装模板》吗?评论区回复【函数】,免费领取,写自动化脚本直接复制复用!
“动动小手,点点关注呗~”🫰
夜雨聆风