我正在寻找一个解决方案,以便在之前失败时在定义的步骤重新启动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
步骤。
有什么想法吗?感谢
答案 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
,这是您作为输入给出的步骤。我不会为你编写代码,但如果你需要进一步的帮助,请发布你的解决方案,我很高兴给你一些提示。