Lazy loaded image
embedded
Shell-函数中$?用法
Words 1014Read Time 3 min
2025-8-4
2025-8-4
type
status
date
slug
summary
tags
category
icon
password
Shell 里,$? 的作用是:
保存上一个命令或函数的退出状态码(Exit Status)。
  • 0 表示执行成功
  • 非 0 表示执行失败(错误码)

为什么函数里 $? 非 0 表示“返回值”?

其实这里的“返回值”并不是你在 C 语言里那种函数返回的计算结果,而是 退出状态码

1. $? 的本质

  • Shell 中,任何命令或函数执行完都会返回一个 退出状态码(exit code)。
  • 这个退出码不是打印的输出,而是操作系统层面用来表示 成功还是失败 的一个整数(0–255)。
  • 这个值会存储在 $? 中。
例子:

2. 函数的退出状态

在 Shell 里,函数的退出状态由两种方式决定:

方式一:return 语句

  • return N 会显式指定退出状态码(0–255)。
注意:return 不能返回大于 255 的值,也不能返回字符串。

方式二:函数中最后一条命令的退出码

  • 如果没写 return,函数会用最后一条命令的退出状态码作为返回值。

3. 为什么非 0 表示“有问题”?

  • 这是 UNIX/Linux 约定俗成的规则
    • 0 = 成功
    • 0 = 失败(错误码)
  • 这个约定最早来自 C 语言的 main() 返回值设计,Shell 延续了这个习惯。
  • 因此 $? 在函数里非 0,通常就是代表执行中出现错误,不是运算结果。

4. 如果你想让函数“返回计算结果”

因为 return 只能返回状态码(0–255),不能直接返回一个大整数或字符串,通常用 echo + 命令替换
这种方式 $? 是 0(成功),结果通过标准输出传递。

总结
  • $? 记录的是上一个命令/函数的退出状态码(0 成功,非 0 失败)。
  • 在函数里,return N 或最后一个命令的退出码会影响 $?
  • 如果要返回真正的计算结果,用 echo + 命令替换,而不是 return
 
好,我帮你出几道 $? + Shell 函数 结合的练习题,每道题都会考你对函数退出状态和 $? 的理解。

题目 1

问: 运行结果是什么?为什么?

题目 2

问: $? 的值是多少?为什么?

题目 3

问: $? 输出什么?如果把 return 10 改成 return 300 会怎样?

题目 4

问: ??? 处会输出多少?$? 又是多少?为什么结果可能不一样?

题目 5(综合题)

问: 第一次 $? 的值是多少?第二次是多少?为什么 return 2 不表示“2个文件不存在”?
上一篇
Linux常用命令
下一篇
人生必看50部电影!

Comments
Loading...