我有一个Bash shell脚本,它调用许多命令。
如果任何命令返回非零值,我想让shell脚本自动退出并返回值为1。
如果不显式地检查每个命令的结果,这可能吗?
例如,
dosomething1
if [[ $? -ne 0 ]]; then
exit 1
fi
dosomething2
if [[ $? -ne 0 ]]; then
exit 1
fi
我有一个Bash shell脚本,它调用许多命令。
如果任何命令返回非零值,我想让shell脚本自动退出并返回值为1。
如果不显式地检查每个命令的结果,这可能吗?
例如,
dosomething1
if [[ $? -ne 0 ]]; then
exit 1
fi
dosomething2
if [[ $? -ne 0 ]]; then
exit 1
fi
当前回答
像这样的表达式
dosomething1 && dosomething2 && dosomething3
当其中一个命令返回非零值时将停止处理。例如,下面的命令永远不会打印"done":
cat nosuchfile && echo "done"
echo $?
1
其他回答
运行时带-e或者在顶部设置-e。
再看看set -u。
示例中的if语句是不必要的。就像这样做:
dosomething1 || exit 1
如果你采纳了Ville Laurikari的建议并使用set -e,那么对于某些命令你可能需要使用这个:
dosomething || true
|| true将使命令管道即使在命令失败时也具有真实的返回值,因此-e选项不会终止脚本。
#!/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