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个文件不存在”?- Author:Blinky
- URL:http://preview.tangly1024.com/article/2451c0db-37a0-8077-97c3-cfde13832ba8
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!