$? 是 Shell 中获取上一个命令返回值的特殊变量,0 表示成功,非 0 表示失败;它仅保留最近一条命令(含函数)的退出状态,执行新命令即被覆盖;管道中仅反映最后一个命令状态,中间命令需用 ${PIPESTATUS[n]} 查看。

在 Linux Shell 中,获取上一个命令的返回值,用的是特殊变量 $?。
什么是返回值
每个命令执行完后都会返回一个整数状态码(0–255),Shell 用它表示执行结果:
- 0 表示成功(success)
- 非 0(如 1、2、127、255 等)表示失败或异常
怎么获取上一个命令的返回值
直接使用 $? 即可。它始终保存最近一条命令(含函数调用)的退出状态,但只保留一次——下一条命令执行后就会被覆盖。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 运行命令后立即查:`ls /tmp && echo $?` → 成功时输出 0
- 失败时查:`ls /no-such-dir && echo $?` → 通常输出 2 或 1
- 注意:不能隔开再取,比如 `ls /tmp; date; echo $?` 输出的是 date 的返回值,不是 ls 的
函数的返回值也一样处理
Shell 函数本质是“可执行单元”,它的 return n 语句设置的正是这个退出状态,所以同样用 $? 获取:
- 函数内:
return 42(仅支持整数,超出 255 会自动取模) - 函数外:
myfunc 5; echo $?→ 输出 42 - 若函数中没写 return,默认返回最后一条命令的 $? 值
管道命令的返回值要小心
对于形如 cmd1 | cmd2 | cmd3 的管道,$? 只反映 最后一个命令(cmd3) 的状态。如果想检查中间某条命令是否失败,要用 ${PIPESTATUS[n]}:
-
cat missing.txt | wc -l; echo ${PIPESTATUS[0]}→ 查第一个命令是否出错(如返回 1) -
echo ${PIPESTATUS[@]}→ 一次性显示所有命令的返回值,空格分隔 - 注意:PIPESTATUS 是数组,每次新命令执行后都会刷新,需及时读取

















