如果任何命令返回一个非中断,则中止shell脚本
我有一个Bash shell脚本来调用一些命令。 如果任何命令返回一个非零值,我希望shell脚本自动退出,返回值为1。
这可能没有明确检查每个命令的结果?
例如
dosomething1
if [[ $? -ne 0 ]]; then
exit 1
fi
dosomething2
if [[ $? -ne 0 ]]; then
exit 1
fi
将此添加到脚本的开头:
set -e
如果一个简单的命令以非零的退出值退出,这将导致shell立即退出。 一个简单的命令是任何不是if,while或until测试的一部分,或者是&&或||的一部分 名单。
有关更多详细信息,请参阅“set”内部命令的bash(1)手册页。
我个人用“set -e”启动几乎所有的shell脚本。 当一些脚本在中间失败并且为脚本的其余部分打破假设时,脚本固执地继续运行真的很烦人。
要添加到接受的答案:
请记住, set -e
有时是不够的,特别是如果你有管道。
例如,假设你有这个脚本
#!/bin/bash
set -e
./configure > configure.log
make
...按预期工作: configure
错误会中止执行。
明天你做出一个看似微不足道的变化:
#!/bin/bash
set -e
./configure | tee configure.log
make
...现在它不起作用。 这在这里解释,并提供一个解决方法(仅限Bash):
#!/bin/bash set -e set -o pipefail ./configure | tee configure.log make
你的例子中的if语句是不必要的。 只要这样做:
dosomething1 || exit 1
如果你采用Ville Laurikari的建议并使用set -e
那么对于一些命令,你可能需要使用这个命令:
dosomething || true
|| true
如果命令失败, || true
将使命令管道有一个true
返回值,所以-e
选项不会终止脚本。
上一篇: Aborting a shell script if any command returns a non
下一篇: Using getopts in bash shell script to get long and short command line options