我在bash中有多行代码的if语句,有时在运行脚本的任何代码行抛出错误消息时,请你告诉我如何处理错误。我只想抓住错误并显示一些错误消息来识别,而且我也不想停止正在运行的脚本,因为它有7800行代码我想继续下一步。如果循环,每个测试步骤都在内部。我想知道如何处理具有一系列代码行的if循环中的错误。
非常感谢您的帮助。
答案 0 :(得分:1)
您基本上可以选择在每个命令后检查错误代码。特别是对于失败的命令。这与检查C库函数的返回码非常相似。它通过错误处理来淹没代码,因此最好在可重用的函数中执行它。
您可以通过检查$?
错误代码变量来执行此操作,但更常见的是您使用shell评估0退出代码作为布尔值true的事实。
因此,对于单个命令,可以使用||
(或)列表运算符来完成,该运算符仅在第一个返回false(也就是非零退出代码,即错误)时评估第二个术语(shell函数):
function die { echo "$1" 1>&2 ; exit 1; }
mkdir ./bla || die "Cannot create directory ./bla errno=$?"
bash(shell)通常在发生错误后继续进行,这可能会产生非常严重的情况。例如,在这种情况下,如果临时目录不存在,脚本将销毁当前目录的内容:
cd /home/user/temp
rm -rf *
通过设置" set -e"来关闭此行为是一件好事。
set -e
cd /home/user/temp
rm -rf *
或者具体说明依赖关系(使用&&
和list运算符而不是换行符或;
):
# execute rm only if cd was sucessful
cd /home/user/temp && rm -rf *
所以通常一个好主意(caveat)打开"退出错误"模式。 在这种情况下,您希望允许失败的命令需要像以下一样保护:
set -e
cd /home/user/temp
rm -rf * || true # ignore failures
最后,使用完成陷阱处理程序完成对代码块的更复杂的错误处理。它在程序退出时执行,您可以使用它来打印错误。这可以与其他编程语言中的try / catch进行比较,但在某些定义的条件下它是更低级别的背景解释:
function errorhandler
{ echo "Unexpected error while cleaning dir: $1 - $2"; exit 1 }
# try-start - capture errors
trap "errorhandler $LINENO $BASH_COMMAND" ERR
cd /home/user/temp
rm * || true # dont trigger error handler here
# try-end - stop capturing errors
trap - ERR
陷阱(trap "cleanup_function" EXIT
)也是typically used(除了信号处理),用于在程序块的(意外)结束时展开/停止更改和临时资源。