一般来说一个shell脚本是顺序执行的,如果前一条命令出错,则脚本退出,后面的命令不会执行。
引用=========================================================
使用set -e
你写的每一个脚本的开始都应该包含set -e。这告诉bash一但有任何一个语句返回非真的值,则退出bash。使用-e的好处是避免错误滚雪球般的变成严重错误,能尽早的捕获错误。更加可读的版本:set -o errexit
使用-e把你从检查错误中解放出来。如果你忘记了检查,bash会替你做这件事。不过你也没有办法使用$?来获取命令执行状态了,因为bash无法获得任何非0的返回值。你可以使用另一种结构:
command
if [ "$?"-ne 0]; then echo "command failed"; exit 1; fi
可以替换成:
command || { echo "command failed"; exit 1; }
或者使用:
if ! command; then echo "command failed"; exit 1; fi
如果你必须使用返回非0值的命令,或者你对返回值并不感兴趣呢?你可以使用 command || true ,或者你有一段很长的代码,你可以暂时关闭错误检查功能,不过我建议你谨慎使用。
set +e
command1
command2
set -e
相关文档指出,bash默认返回管道中最后一个命令的值,也许是你不想要的那个。比如执行 false | true 将会被认为命令成功执行。如果你想让这样的命令被认为是执行失败,可以使用set -o pipefail
原文地址: http://blog.csdn.net/drbinzhao/article/details/8281645
根据上文,理论上可以通过 set +e来关闭错误影响。实际效果不 理想。
如果想在脚本里出错还继续执行,有一个可行的方法是,把执行可能出错的语句写在一个脚本a.sh里,然后在主脚本里通过 . a.sh来调用执行。这样即使a.sh执行出错,主脚本也不会退出,它会继续执行后面的语句。 一个不好的地方是,调用脚本的方式不能获取返回值。return命令只能用在函数,或者使用source a.sh来获取返回值。
注:
return: can only`return' from a function or sourced script