如何根据 shell 函数 return 值创建 "resume structure"

How to create a "resume structure" based on shell functions return value

比方说,我有以下 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
}

我想构建一种方法来执行以下操作:

执行函数 1 ....如果 return 为 0 继续....执行函数 2....等等,否则 (return 1) 停止循环。

我还想 "resume",在下一次执行时从失败的函数开始。(returned 1 )

这个?

f_1 && f_2 && f_3

我看不懂你说的简历。什么是 'next execution'?你想以某种方式保存脚本执行之间的状态吗?或者在同一个脚本中重新执行 'behavior'?

对于记住上次 运行 的任何内容的 "stateful" 应用程序,您需要在某处存储最后的状态。最简单的解决方案是 filw,因此我们将使用它。该文件将被称为 "next_command",但基本上我们也可以使用任何其他文件名。

接下来,我们需要 "conditional or" 语句。它采用 a || b 的形式并被延迟评估。这意味着:如果第一个命令成功,则 a || b 的整个语句已经为真,因此不再执行后面的语句。如果第一个命令失败,我们可以使用它来仅执行第二个命令 - 它比 "if ... ; then ... fi"-construct 稍微短一些,尽管那当然也可以。

最后但并非最不重要的一点是,当我们加载之前保存的状态时,我们将使用 case-construct 跳转到代码的正确部分。

以下代码执行您的请求:

# ...
# your functions here
# ...

save_state() {
    echo "" > 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 ""