Bash - 按步骤进行错误恢复

时间:2016-07-20 07:34:43

标签: bash

我正在寻找一个解决方案,以便在之前失败时在定义的步骤重新启动bash脚本。

例如,我有一个bash脚本:

#my_script.sh:

  #Step 1 
  Action 1

  #Step 2 
  Action 2

  #Step 3 
  Action 3

  #Step 4 
  Action 4

step 3失败后,我希望能够这样称呼它:

./my_script.sh step3

因此,它将从step 3开始,不要重做first 2步骤。

有什么想法吗?感谢

3 个答案:

答案 0 :(得分:3)

我假设如果第2步失败,您想从那里重新开始,而N步骤取决于之前的步骤1 .. N-1

解决此问题的一种方法是在运行脚本时创建戳记文件。

当您完成第1步时,只需touch step1-stamp,当您执行第2步时,touch step2-stamp等等

在执行任务之前,每个步骤都会检查该步骤的标记是否存在,例如步骤N

if [ ! -f "stepN-stamp" ]; then
  # do tasks for step N
  touch stepN-stamp
fi

使用Makefile的类似方法:

.PHONY: all clean

all: step3-stamp

step1-stamp:
    @echo "Performing step 1"
    @touch step1-stamp

step2-stamp: step1-stamp
    @echo "Performing step 2"
    @touch step2-stamp

step3-stamp: step2-stamp
    @echo "Performing step 3"
    @touch step3-stamp

clean:
    rm -f step[123]-stamp

注意:这都是假设您不想运行随机步骤。您可以做的是删除一个或多个戳记文件,并从头开始重新运行整个过程。特别是Makefile解决方案将优雅地处理它,因为它将强制重新运行相关步骤。

答案 1 :(得分:1)

bash 4在case语句中使用;&终止符引入了直降行为。

# Contents of script
case ${1:-step1} in
  step1) echo "Running step 1" ;&
  step2) echo "Running step 2" ;&
  step3) echo "Running step 3" ;&
  step4) echo "Running step 4" ;&
  step5) echo "Running step 5" ;;
  *) echo "Unrecognized starting point: $1"; exit 1 ;;
esac

运行此脚本:

$ bash script step3
Running step 3
Running step 4
Running step 5

答案 2 :(得分:0)

您可以以一种方式编写代码,您可以将其作为输入提供的步骤如下:./my_script.sh 3。然后在您的代码中,您可以使用一个case语句作为“输入”$1,这是您作为输入给出的步骤。我不会为你编写代码,但如果你需要进一步的帮助,请发布你的解决方案,我很高兴给你一些提示。