linux shell脚本中用变量保存运行状态的核心是及时捕获命令退出码($?)、设置语义化自定义状态变量(如init_ok=1)、组合记录错误详情,并注意作用域限制;必须立即保存$?,避免被覆盖。

在 Linux Shell 脚本中,用变量保存运行状态,核心是把关键执行结果(尤其是命令退出码、成功标志、错误信息等)及时捕获并存入变量,后续可据此做判断或日志记录。这不是单纯“记个数字”,而是构建可控的流程反馈机制。
用 $? 捕获上一条命令的退出状态
每个命令执行完都会返回一个退出码(0 表示成功,非 0 表示失败),Shell 自动存入特殊变量 $?。它只保留上一条命令的结果,必须立即保存,否则会被下一条命令覆盖。
- 执行命令后立刻赋值:status=$?
- 不要跨行或插入其他命令再取值,例如下面会出错:
ls /tmp
echo "上条命令状态:$?" # 这里 $ ? 实际是 echo 命令自己的退出码 - 典型用法:
cp file1.txt /backup/
copy_status=$?
if [ $copy_status -eq 0 ]; then
echo "备份成功"
else
echo "备份失败,错误码:$copy_status"
fi
用自定义变量标记阶段状态
对多步骤脚本,建议为每个关键环节设一个状态变量,比如 init_ok、config_loaded、service_started,用 0 或 1 表示“完成/未完成”或“成功/失败”,语义更清晰。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 初始化阶段:init_ok=0
mkdir -p /var/log/myscript && init_ok=1 - 检查是否就绪:if [ $init_ok -eq 1 ]; then ... fi
- 避免混用字符串和数字,如不用 status="success",因为后续判断需额外字符串比较,易出错且不统一
组合使用变量记录详细信息
仅靠退出码有时不够,比如命令执行了但逻辑异常(如文件存在但内容为空)。这时可用普通变量补充上下文:
- 记录错误原因:error_msg=""
if ! grep -q "expected" data.log; then
error_msg="缺少预期关键字"
run_status=2
fi - 输出完整状态:echo "运行状态:$run_status,详情:$error_msg"
- 日志中写入:echo "$(date): status=$run_status, msg='$error_msg'" >> /var/log/myscript.log
注意变量作用域与持久化
脚本内定义的状态变量默认是局部的,退出脚本即消失。若需跨脚本传递(如主脚本调用子脚本后检查其状态),有几种方式:
- 子脚本用 exit N 返回状态码,主脚本用 $? 接收
- 子脚本将状态写入临时文件(如 /tmp/myscript.status),主脚本读取
- 用 export 导出变量仅对子 shell 生效,但不能反向传回父 shell —— 所以不适用于“子脚本改父脚本变量”这种需求










