我有一个Bash shell脚本,它调用许多命令。

如果任何命令返回非零值,我想让shell脚本自动退出并返回值为1。

如果不显式地检查每个命令的结果,这可能吗?

例如,

dosomething1
if [[ $? -ne 0 ]]; then
    exit 1
fi

dosomething2
if [[ $? -ne 0 ]]; then
    exit 1
fi

当前回答

如果出现错误,下面的脚本将打印一个红色错误消息并退出。 把这个放在你的bash脚本的顶部:

# BASH error handling:
#   exit on command failure
set -e
#   keep track of the last executed command
trap 'LAST_COMMAND=$CURRENT_COMMAND; CURRENT_COMMAND=$BASH_COMMAND' DEBUG
#   on error: print the failed command
trap 'ERROR_CODE=$?; FAILED_COMMAND=$LAST_COMMAND; tput setaf 1; echo "ERROR: command \"$FAILED_COMMAND\" failed with exit code $ERROR_CODE"; put sgr0;' ERR INT TERM

其他回答

如果出现错误,下面的脚本将打印一个红色错误消息并退出。 把这个放在你的bash脚本的顶部:

# BASH error handling:
#   exit on command failure
set -e
#   keep track of the last executed command
trap 'LAST_COMMAND=$CURRENT_COMMAND; CURRENT_COMMAND=$BASH_COMMAND' DEBUG
#   on error: print the failed command
trap 'ERROR_CODE=$?; FAILED_COMMAND=$LAST_COMMAND; tput setaf 1; echo "ERROR: command \"$FAILED_COMMAND\" failed with exit code $ERROR_CODE"; put sgr0;' ERR INT TERM

对已接受的答案补充:

请记住,set -e有时是不够的,特别是如果你有管道。

例如,假设您有这个脚本

#!/bin/bash
set -e 
./configure  > configure.log
make

... 按预期工作:配置中的错误将中止执行。

明天你要做一个看似微不足道的改变:

#!/bin/bash
set -e 
./configure  | tee configure.log
make

... 但现在它不管用了。这里解释了这一点,并提供了一个解决方案(仅Bash):

#!/bin/bash
set -e 
set -o pipefail

./configure  | tee configure.log
make

运行时带-e或者在顶部设置-e。

再看看set -u。

像这样的表达式

dosomething1 && dosomething2 && dosomething3

当其中一个命令返回非零值时将停止处理。例如,下面的命令永远不会打印"done":

cat nosuchfile && echo "done"
echo $?
1
#!/bin/bash -e

应该足够了。