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

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

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

例如,

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

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

当前回答

美元吗?很少需要变量。伪成语命令;如果[$?-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

其他回答

示例中的if语句是不必要的。就像这样做:

dosomething1 || exit 1

如果你采纳了Ville Laurikari的建议并使用set -e,那么对于某些命令你可能需要使用这个:

dosomething || true

|| true将使命令管道即使在命令失败时也具有真实的返回值,因此-e选项不会终止脚本。

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

[[ `cmd` ]] && echo success_else_silence

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

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

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

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

再看看set -u。

#!/bin/bash -e

应该足够了。

像这样的表达式

dosomething1 && dosomething2 && dosomething3

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

cat nosuchfile && echo "done"
echo $?
1