You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本中如何在if...elif结构正确判断命令退出状态?

Bash挂载脚本的判断逻辑修正

最初代码的问题

你的初始脚本存在两个关键错误:

  1. 语法错误:方括号前后缺少空格
    [$? -eq 0] 这种写法会被Bash识别为完整的命令名,直接触发「command not found」错误。正确写法是 [ $? -eq 0 ]——[ 是Bash内置命令,必须和参数之间保留空格。
  2. $? 值被覆盖
    if 语句本身属于命令,执行后会更新 $? 的值(变为if条件判断的返回结果)。所以当挂载命令返回32时,进入elif分支时,$?已经不是挂载命令的退出状态,自然无法正确判断。

存储退出状态到变量的方法完全可行

你的思路是正确的,把挂载命令的退出状态存入变量就能避免$?被覆盖的问题,但需要修正变量赋值的语法:

/bin/mount DISK1 "${MOUNT_PATH}"
# 赋值时变量名前不加$,等号前后不能有空格
mnt_stat=$?
# 方括号前后必须加空格,变量用双引号包裹避免空格问题
if [ "${mnt_stat}" -eq 0 ]; then
  echo "Mounted DISK 1 at ${MOUNT_PATH}"
elif [ "${mnt_stat}" -eq 32 ]; then
  echo "DISK 1 read error"
else
  echo "FAILED TO MOUNT"
fi

重点修正项:

  • 变量赋值:mnt_stat=$?(禁止写成 $mnt_stat = $?,Bash赋值不允许等号前后有空格,且左侧变量名不带$)
  • 条件判断:[ "${mnt_stat}" -eq 0 ](方括号前后加空格,变量用双引号包裹,防止变量值含空格时触发语法错误)

另一种更简洁的写法

也可以直接在if中执行挂载命令,利用命令的退出状态做判断,无需单独存储变量:

if /bin/mount DISK1 "${MOUNT_PATH}"; then
  echo "Mounted DISK 1 at ${MOUNT_PATH}"
elif [ $? -eq 32 ]; then
  echo "DISK 1 read error"
else
  echo "FAILED TO MOUNT"
fi

这种写法中,if直接执行挂载命令,命令返回0时进入第一个分支;如果失败,$?此时仍保留挂载命令的退出状态,因此elif可以直接判断32的情况。不过当逻辑更复杂时,存储变量的方式可读性更强。

内容的提问来源于stack exchange,提问作者Patratacus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:47:38