Bash脚本中如何在if...elif结构正确判断命令退出状态?
Bash挂载脚本的判断逻辑修正
最初代码的问题
你的初始脚本存在两个关键错误:
- 语法错误:方括号前后缺少空格
[$? -eq 0]这种写法会被Bash识别为完整的命令名,直接触发「command not found」错误。正确写法是[ $? -eq 0 ]——[是Bash内置命令,必须和参数之间保留空格。 $?值被覆盖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
相关产品推荐
相关产品推荐

