Для приложения с сохранением состояния, которое запоминает что-либо из последнего запуска, вам нужно где-то хранить последнее состояние. Самое простое решение - это дурак, поэтому мы будем его использовать. Файл будет называться «next_command», но в основном мы можем использовать и любое другое имя файла.
Далее нам понадобится оператор «condition or». Он принимает форму a || b
и оценивается лениво. Это означает: если первая команда успешна, весь оператор a || b
уже верен, поэтому более поздние операторы больше не выполняются. Мы можем использовать это, чтобы выполнить вторую команду только в том случае, если первая не удалась - она несколько короче, чем конструкция "if ...; then ... fi", хотя это, конечно, также будет работать.
И И последнее, но не менее важное: мы будем использовать конструкцию case для перехода к правильной части кода при загрузке ранее сохраненного состояния.
Следующий код выполняет то, что вы запрашиваете:
# ...
# your functions here
# ...
save_state() {
echo "$1" > next_command
}
load_state() {
cat next_command
}
# this means: save the output of load_state in the var state
# use f_1 as default)
state="$(load_state)"
# this means: take the content ofd $state, use "f_1" as default if it's empty
# and then, compare it's content to each pattern noted below. For the first that
# matches, execute all code until you encounter ;;
case "${state:-f_1}" in
f_1)
f_1 || {
save_state f_1
exit 1
}
;& # this is a fall-through - it means we continue executing code in the following cases
f_2)
f_2 || {
save_state f_2
exit 1
}
;&
f_3)
f_3 || {
save_state f_3
exit 1
}
;; # here, we do not want to continue but instead go to the end of the case
*) # default, if sate is something invalid
echo "Invalid saved state, terminating execution"
exit 2
esac
# we went through everything, clear last saved state
save_state ""