shell脚本怎么设置语句出错自动退出?(set -eset -o errexit)使用未初始化的变量自动退出?(set -uset -o nounset)(退出脚本)shell set
Posted Dontla
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本怎么设置语句出错自动退出?(set -eset -o errexit)使用未初始化的变量自动退出?(set -uset -o nounset)(退出脚本)shell set相关的知识,希望对你有一定的参考价值。
文章目录
使用set -e、set -o errexit
你写的每一个脚本的开始都应该包含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
使用set -u、set -o nounset
你因为没有对变量初始化而使脚本崩溃过多少次?对于我来说,很多次。
chroot=$1
...
rm -rf $chroot/usr/share/doc
如果上面的代码你没有给参数就运行,你不会仅仅删除掉chroot中的文档,而是将系统的所有文档都删除。那你应该做些什么呢?好在bash提供了set -u,当你使用未初始化的变量时,让bash自动退出。你也可以使用可读性更强一点的set -o nounset。
其他set命令
-x 执行指令后,会先显示该指令及所下的参数。(只打印执行的命令)
-v 显示shell所读取的输入值。(注释也会打印)
以上是关于shell脚本怎么设置语句出错自动退出?(set -eset -o errexit)使用未初始化的变量自动退出?(set -uset -o nounset)(退出脚本)shell set的主要内容,如果未能解决你的问题,请参考以下文章