shell脚本和函数的返回值是0–255的整数状态码,非数据;exit 0表示成功,非0表失败,超出范围则模256;return同理,不能跟字符串;捕获需立即用$?,且不可中断。

Shell 脚本的返回值不是“返回数据”,而是表示执行状态的整数,范围严格限定在 0–255。理解这一点是正确处理 exit 状态码和函数返回值的前提。
exit 状态码:脚本退出时的唯一反馈
每个 Shell 脚本运行结束后,都会向父进程返回一个整数状态码。这个值由 exit 命令显式指定,或隐式取自脚本中最后一条命令的退出状态。
- 状态码 0 表示成功,这是 Unix/Linux 的通用约定
- 非 0 值(如 1、2、127、255)代表不同类型的失败,可自行定义含义(例如 1=参数错误,2=文件不存在)
- 若传入
exit的数值超出 0–255,Bash 会自动对其模 256 取余。比如exit 257实际返回1,exit -1返回255 - 不带参数的
exit等价于exit $?,即沿用上一条命令的状态码
函数 return 值:本质是子过程的 exit 码
Shell 函数没有传统编程语言意义上的“返回值”,return 实际设置的是函数这一“子过程”的退出状态码,同样只能是 0–255 的整数。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 函数体内不写
return,则以最后一条命令的退出状态为函数返回值 -
return后不能跟字符串或变量展开结果(如return "$var"),否则报错 “too many arguments” - 想传递文本内容,必须用
echo输出,再通过命令替换捕获:result=$(myfunc)
捕获返回值的关键时机与方法
Shell 中只有一个全局变量 $? 记录上一条命令的退出状态,它极易被覆盖。因此捕获必须紧邻目标命令之后。
- 调用函数后,下一行立即读取
$?,中间不能插入任何其他命令(包括echo、赋值、条件判断等) - 若需同时获取函数输出和返回码,顺序固定:
output=$(myfunc)ret=$?
先捕获 stdout,再立刻存$?,顺序颠倒或插入语句都会导致 ret 错误 - 在 if 判断中,可直接用函数名作为条件:
if myfunc; then ... fi,此时 if 实际检查的就是该函数的return值
常见误区与调试建议
很多问题源于对状态码生命周期的误判。
- 把
return "ok"当作返回字符串——语法错误,return只接受数字 - 在
$(func)后隔行再取$?——已被命令替换内部的子 shell 状态覆盖 - 混淆
echo输出和return状态:前者用于传数据,后者仅表成功/失败或分类错误码 - 调试时可在关键位置加
echo "DEBUG: exit code = $?",但注意这会改写$?,应放在取值之后










