Как создать «структуру резюме» на основе возвращаемых значений функций оболочки - PullRequest
0 голосов
/ 15 апреля 2020

Допустим, у меня есть 3 функции, как показано ниже:

#!/bin/bash

f_1()
{
if [ -d "/home/xxx/yyy" ];
   then
       return 0
   else
      return 1
fi
}

f_2()
{
if [ -d "/home/xxx/yyy" ];
   then
       return 0
   else
      return 1
fi
}

f_3()
{
if [ -d "/home/xxx/yyy" ];
   then
       return 0
   else
      return 1
fi
}

Я хочу создать способ сделать следующее:

функция excute 1 .... если return равен 0 продолжайте с .... excute function 2 .... и так далее, иначе (return 1) остановите l oop.

Также я хочу «возобновить», при следующем выполнении, начиная с функции, которая завершилась ошибкой. (Возвращено 1)

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Для приложения с сохранением состояния, которое запоминает что-либо из последнего запуска, вам нужно где-то хранить последнее состояние. Самое простое решение - это дурак, поэтому мы будем его использовать. Файл будет называться «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 ""
0 голосов
/ 15 апреля 2020

Это?

f_1 && f_2 && f_3

Я не понимаю резюме, которое вы упомянули. Что такое «следующее исполнение»? Вы хотите как-то сохранить состояние между выполнением скрипта? или в рамках того же сценария повторно выполнить «поведение»?

...