如何编写 HUSH shell 脚本来测试每个命令的结果?

如何编写 HUSH shell 脚本来测试每个命令的结果?

我怎样才能让这个脚本检查命令的状态并在任何失败时退出:

#!/bin/sh
echo JFFS2 Preparation

cd /root

/root/config 1 > /root/formatted

if grep "PAR_JFFS2_FORMATTED = -1" /root/formatted; then
  echo Need to Format MTD2
  rm -f /root/formatted

  flash_eraseall -j /dev/mtd2

  echo Marking file system as formatted
  /root/config 1 1355270400

  mount -t jffs2 -o noatime /dev/mtdblock2 /mnt

  echo "Formmatted" > /mnt/formatted.txt

else
  mount -t jffs2 -o noatime /dev/mtdblock2 /mnt
fi

答案1

set -e在脚本的早期添加,或将该#!行更改为#!/bin/sh -e,这将具有相同的效果。

这会设置errexitshell 选项,这意味着一旦命令返回非零退出状态,脚本就会退出,但以下例外(取自POSIX 描述set):

  1. 多命令管道中任何单个命令的失败都不应导致 shell 退出。仅考虑管道本身的故障。

  2. 当执行、、或保留字-e之后的复合列表、以保留字开头的管道 或除最后一个 AND-OR 列表的任何命令时,应忽略该设置。whileuntilifelif!

  3. -e如果除子 shell 命令之外的复合命令的退出状态是在被忽略时失败的结果,则-e不适用于该命令。

另一种方法是在每个命令之后添加|| exit您想要退出的命令(如果它们失败)。例如

flash_eraseall -j /dev/mtd2 || exit

答案2

bash 中的每个命令之后的返回码都存储在$?变量中。如果命令成功,其值应为

successfulcommand    
echo $?
0

如果出现错误,结果将不为零,并且会根据错误而变化。

unsuccessfulcommand
echo $?
2

相关内容