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

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

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

例如,

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

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

当前回答

对已接受的答案补充:

请记住,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

其他回答

#!/bin/bash -e

应该足够了。

我只是抛出了另一个参考,因为马克埃德加斯输入了一个额外的问题,这里是一个额外的例子,涉及到整个主题:

[[ `cmd` ]] && echo success_else_silence

这与有人显示的cmd || exit errcode相同。

例如,如果挂载了分区,我想确保分区是卸载的:

[[ `mount | grep /dev/sda1` ]] && umount /dev/sda1

对已接受的答案补充:

请记住,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

美元吗?很少需要变量。伪成语命令;如果[$?-eq 0];那么X;Fi应该总是写成command;那么X;fi。

$?Is required是指需要检查多个值:

command
case $? in
  (0) X;;
  (1) Y;;
  (2) Z;;
esac

或者什么时候$?需要重用或以其他方式操作:

if command; then
  echo "command successful" >&2
else
  ret=$?
  echo "command failed with exit code $ret" >&2
  exit $ret
fi

如果你需要在退出时进行清理,你也可以使用'trap'和伪信号ERR。这与捕获INT或任何其他信号的方式相同;如果任何命令以非零值退出,bash将抛出ERR:

# Create the trap with   
#    trap COMMAND SIGNAME [SIGNAME2 SIGNAME3...]
trap "rm -f /tmp/$MYTMPFILE; exit 1" ERR INT TERM
command1
command2
command3
# Partially turn off the trap.
trap - ERR
# Now a control-C will still cause cleanup, but
# a nonzero exit code won't:
ps aux | grep blahblahblah

或者,特别是当你使用"set -e"时,你可以捕获EXIT;然后,当脚本因为任何原因退出时,包括正常结束、中断、由-e选项导致的退出等等,都会执行陷阱。