如果任何命令返回一个非中断,则中止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选项不会终止脚本。

链接地址: http://www.djcxy.com/p/97099.html

上一篇: Aborting a shell script if any command returns a non

下一篇: Using getopts in bash shell script to get long and short command line options