Shell函数通过return返回0–255状态码(0成功,非0失败)供条件判断,用echo输出实际数据并以$(...)捕获;二者用途分明、互不干扰,禁用全局变量、临时文件等不健壮方式。

Linux Shell 函数本身不支持传统编程语言那样的“返回值变量”,但可通过两种明确、互不干扰的机制传递信息:一种是表示执行成败的状态码(用于判断逻辑),另一种是输出具体数据的结果值(用于获取内容)。关键在于区分用途,避免混用。
用 return 返回状态码(判断成功或失败)
这是 Shell 的标准做法,符合 POSIX 规范。函数默认以最后一条命令的退出状态为返回值;也可用 return N 显式指定(N 必须是 0–255 的整数):
- 0 表示成功(true),非 0(如 1、2…)表示失败(false)
- 调用后立即用
$?获取该状态,延迟读取会丢失(因为后续命令会覆盖它) - 常用于条件判断:
if myfunc; then ... fi或myfunc && echo ok || echo fail
用 echo 输出结果值(获取计算或查询内容)
当需要返回字符串、数字、路径等实际数据时,return 无能为力(它只能返回 0–255 整数),此时应让函数 echo 结果,再用命令替换捕获:
- 写法示例:
result=$(myfunc "input")或result=`myfunc "input"` - 函数内部不要用
return干扰输出——echo内容会被捕获,而return值只影响$? - 注意:
echo的换行和空格会被保留,必要时用printf或sed清理
不推荐的替代方式
虽然技术上可行,但以下方法易引发维护问题或竞态风险,应尽量避免:
- 全局变量赋值:函数修改外部变量,容易造成命名冲突和状态污染
- 写入临时文件:涉及 I/O、权限、清理,效率低且不健壮
- 用 argv 传地址:Shell 不支持指针或引用,所谓“传参回写”实为模拟,可读性差
组合使用状态与结果的典型场景
一个健壮的函数往往同时提供状态和结果:比如检查并读取配置项:
- 用
return 0表示“找到且读取成功”,return 1表示“未找到”,return 2表示“权限不足” - 同时用
echo "value"输出实际值,供调用方捕获 - 调用时先检查
$?判断是否可安全使用该值,再处理$(...)的内容


















