【发布时间】:2011-10-21 03:24:52
【问题描述】:
我正在寻找 shell 脚本中的异常处理机制。 shell脚本中是否有try,catch等价机制?
【问题讨论】:
标签: bash shell exception-handling
我正在寻找 shell 脚本中的异常处理机制。 shell脚本中是否有try,catch等价机制?
【问题讨论】:
标签: bash shell exception-handling
{
# command which may fail and give an error
} || {
# command which should be run instead of the above failing command
}
【讨论】:
better,而不仅仅是他们可能无法理解的一段神秘代码。如果孩子听不懂,那就不好回答了。
当error_exit 是接受一个参数的函数时,使用以下方法正确处理错误。如果没有传递参数,那么它将在实际发生错误的地方抛出未知错误 LineNo。请在实际用于生产之前进行试验-
#!/bin/bash
PROGNAME=$(basename $0)
error_exit()
{
echo "${PROGNAME}: ${1:-"Unknown Error"}" 1>&2
exit 1
}
echo "Example of error with line number and message"
error_exit "$LINENO: An error has occurred."
【讨论】:
这里是 bash 中的two simple bashfunctions which enable eventhandling:
您可以将它用于基本的异常处理,如下所示:
onFoo(){
echo "onFoo() called width arg $1!"
}
foo(){
[[ -f /tmp/somefile ]] || throw EXCEPTION_FOO_OCCURED "some arg"
}
addListener EXCEPTION_FOO_OCCURED onFoo
bash 不支持使用 try/catch 块进行异常处理,但是,您可能想尝试查看支持它的 BANGSH 框架(它有点像 bash 的 jquery)。
然而,没有级联 try/catch 块的异常处理类似于 事件处理,是 可以在几乎任何语言中支持数组。
如果你想让你的代码保持整洁(没有 if/else 冗长),我建议使用事件。
MatToufoutu 推荐的建议(使用 || 和 &&)不推荐用于函数,但可以用于简单的命令。 (有关风险,请参阅BashPitfalls)
【讨论】:
在 bash 中并没有真正的 try/catch(我假设您正在使用 bash),但您可以使用 && 或 || 实现非常相似的行为。
在本例中,如果a_command 失败(返回非零值),您想运行fallback_command:
a_command || fallback_command
在这个例子中,如果a_command成功(返回0),你想执行second_command:
a_command && second_command
它们可以通过使用子shell轻松混合在一起,例如,以下命令将执行a_command,如果成功则运行other_command,但如果a_command或other_command失败,则@987654334 @ 将被执行:
(a_command && other_command) || fallback_command
【讨论】:
(a_command || : ) 并且下一行将运行,就好像在 a_command 中没有发生错误一样.
if/else 结构和退出代码可以帮助您伪造其中的一部分。这应该可以在 Bash 或 Bourne (sh) 中使用。
if foo ; then
else
e=$? # return code from if
if [ "${e}" -eq "1"]; then
echo "Foo returned exit code 1"
elif [ "${e}" -gt "1"]; then
echo "Foo returned BAD exit code ${e}"
fi
fi
【讨论】:
if foo ; then else 可以简化为if ! foo ; then,无论如何+1。