我有一个 bash 脚本,可以使用 case 语句恢复中止的执行。它在 CentOS 6 下与 Bash 4 配合得很好,但由于 Bash 3.2 而无法与 CentOS 5 配合使用。
是否有任何编程逻辑可以用来将以下内容替换为更“可移植”的内容?
last-action=$(cat /tmp/last-action)
case last-action in)
beginning)
function1
;&
middle)
function2
;&
end)
function3
;&
esac
问题是,无论任务执行在哪里停止,它都必须从那里恢复并执行之后的所有内容。例如,如果last-action=middle
,它将执行function2
,然后执行function3
。这就是运算符 ;&
派上用场的地方。
有什么线索可以在没有大量 if
语句的情况下做到这一点吗?
最佳答案
我知道 Fallthrough 非常方便,但鉴于您的示例片段,我不知道如何实现
case "${last_action}" in
beginning)
function1
function2
function3
;;
middle)
function2
function3
;;
end)
function3
;;
esac
会给你的代码增加很多开销。它仍然比许多 if
更漂亮。
但是,如果您的开关更复杂并且您希望它更加动态,您可以执行以下操作:
#!/bin/bash
function1() { echo 1; }
function2() { echo 2; }
function3() { echo 3; }
last_action=$1
actions_beginning="function1 function2 function3"
actions_middle="function2 function3"
actions_end="function3"
_actions="actions_${last_action}"
for action in ${!_actions}; do
"${action}"
done
$ ./test.sh beginning
1
2
3
$ ./test.sh middle
2
3
$ ./test.sh end
3
编辑:只要看了你在 github 上的代码,我自己肯定会走这条路。
关于bash - 如何在没有 `;&` 的 Bash 3.2 中链接案例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17955369/