如何根据 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 ""
比方说,我有以下 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 ""