bash - 如何在没有 `;&` 的 Bash 3.2 中链接案例?

标签 bash case centos5

我有一个 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/

相关文章:

linux - 如何使 Linux bash 终端中的 ctrl+c 行为看起来像 OSX 终端

linux - 如何根据 bash 中的用户输入修改文件

mysql - 超过两周的 MySQL 考勤卡加类

mysql - SET GLOBAL max_allowed_pa​​cket 不起作用

linux - 如何在bash中将结果转换为整数

mysql - MySQL 中的 SHOW COLUMNS 别名

Mysql case 语句不起作用

MySQL SELECT WHERE 在 IF 语句中

linux - Apache w/mod_rails 段错误

.net - 单声道 3 - 403 错误