相当于Ruby的确保或Java最终在shell脚本中?

时间:2015-06-30 14:46:01

标签: bash shell scripting try-catch-finally

我很确定我的问题的答案是否定的,但我正在寻求确认。

在Ruby中,以下块:

begin
  foo
rescue
  bar
ensure
  baz
end

将开始执行foo,如果出现任何错误,它将停止执行foo并开始执行bar

ensure块是最后运行的代码,无论 foo期间是否有任何错误。

Java具有相同的结构,但关键字为trycatchfinally

这是我想要在bash脚本中完成的部分:我想要一段代码片段,它将在我脚本的最末端运行,或者在引发错误并且脚本想要退出后立即运行。 / p>

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:0)

假设:

  • fo是一个bash函数,在成功时返回0
  • barbaz是bash函数

以下内容应符合您的期望:

foo
if [[ $? != 0 ]]; then
    bar
fi
baz

较短的版本:

if ! foo; then
    bar
fi
baz

答案 1 :(得分:0)

您可以安装一个将在退出时运行的陷阱处理程序,无论是来自显式exit命令还是到达脚本末尾。

trap 'echo script exiting with exit code $?' EXIT

答案 2 :(得分:0)

Bash有许多虚假的信号:

EXIT代码在退出脚本时执行

RETURN代码在调用return时执行(通常在函数中)

DEBUG代码在每个语句

执行

ERR代码在出错时执行(条件是一种特殊情况)

您可以使用ERR伪信号设置错误的trap处理程序。例如:

foo() {
    echo "Executing foo"
    return 1    # non-zero is a failure
}

bar() {
    echo "Executing bar"
}

baz() {
    echo "Executing baz"
} 

trap 'bar' ERR
foo

# Reset trap
trap - ERR
baz

给出:

Executing foo
Executing bar
Executing baz

如果foo被更改为返回零:

Executing foo
Executing baz

函数通常不会继承ERR陷阱,但请参阅set -E