$?是shell内置特殊变量,专用于保存上一条命令的退出状态码;必须在目标命令执行后立即使用,否则会被后续命令覆盖,且echo本身会将其重置为0。

直接用 echo $? 就能获取上一个命令的退出状态码。
为什么是 $? ?
在 Shell 中,$? 是一个特殊变量,它始终保存着**上一条命令执行完毕后返回的退出状态码**。这个值只保留最近一次命令的结果,执行新命令后就会被覆盖。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
怎么用才不会出错?
- 必须在目标命令执行完后立刻运行
echo $?;中间不能插入其他命令,否则查到的是那条命令的退出码 - 注意:
echo本身也是命令,它成功执行后会把 $? 变成 0 —— 所以别在echo $?后再查一次 - 常见误操作:
ls /noexist; echo $?; echo $?——第二个echo $?输出的是第一个echo的结果(0),不是ls的
实际例子看效果
(以下每行单独执行)
-
ls /tmp && echo "存在" || echo "不存在"—— 利用退出码自动分支 -
grep "key" file.txt; echo "上一步退出码:$?"—— 查找后立刻打印状态 -
[ -f "config.conf" ]; echo "文件存在? $?"—— 测试文件是否存在,0 表示存在
退出码的含义要记牢
Shell 判断“成功”或“失败”,只看数字,不看文字:
- 0:表示命令执行成功(不管输出什么内容)
-
非0(1–255):表示失败,不同命令约定不同含义(如
grep找不到匹配返回 1,ls目录不存在返回 2) - 超过 255 的值会被自动取模,比如
exit 257实际记录为 1










