我是靠谱客的博主 欣喜黑裤,最近开发中收集的这篇文章主要介绍linux任何命令返回0,linux - 如果任何命令返回非零值,则中止shell脚本?,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

linux - 如果任何命令返回非零值,则中止shell脚本?

我有一个调用许多命令的Bash shell脚本。如果任何命令返回非零值,我希望shell脚本自动退出,返回值为1。

如果没有明确检查每个命令的结果,这可能吗?

例如

dosomething1

if [[ $? -ne 0 ]]; then

exit 1

fi

dosomething2

if [[ $? -ne 0 ]]; then

exit 1

fi

9个解决方案

622 votes

将其添加到脚本的开头:

set -e

如果一个简单的命令以非零退出值退出,这将导致shell立即退出。 一个简单的命令是任何命令都不属于if,while或者直到测试,或者是&&和/或 或||名单。

有关更多详细信息,请参阅“set”内部命令的bash(1)手册页。

我个人用“set -e”启动几乎所有的shell脚本。 当一个脚本在中间出现故障并且打破脚本其余部分的假设时,让脚本顽固地继续下去真的很烦人。

Ville Laurikari answered 2019-01-27T18:57:15Z

167 votes

要添加到接受的答案:

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

例如,假设您有此脚本

#!/bin/bash

set -e

./configure > configure.log

make

...按预期工作:configure中的错误中止执行。

明天你会做出一个看似微不足道的变化:

#!/bin/bash

set -e

./configure | tee configure.log

make

......现在它不起作用。 这里解释了这一点,并提供了一种解决方法(仅限Bash):

设置-o pipefail./configure | tee configure.log使

leonbloy answered 2019-01-27T18:58:15Z

70 votes

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

dosomething1 || exit 1

如果您接受Ville Laurikari的建议并使用|| true,那么对于某些命令,您可能需要使用此命令:

dosomething || true

即使命令失败,|| true也会使命令管道返回值为true,因此-e选项不会终止该脚本。

Zan Lynx answered 2019-01-27T18:58:50Z

26 votes

如果你需要在退出时进行清理,你也可以使用'陷阱'和伪信号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选项引起的退出等。

fholo answered 2019-01-27T18:59:18Z

12 votes

在顶部运行set -u或set -e。

另请参阅set -u。

lumpynose answered 2019-01-27T18:59:46Z

10 votes

很少需要$?变量。 伪习语command; if [ $? -eq 0 ]; then X; fi应始终写为if command; then X; fi。

需要$?的情况是需要针对多个值进行检查的时间:

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

Mark Edgar answered 2019-01-27T19:00:21Z

3 votes

一个表达式

dosomething1 && dosomething2 && dosomething3

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

cat nosuchfile && echo "done"

echo $?

1

gabor answered 2019-01-27T19:00:49Z

3 votes

#!/bin/bash -e

应该足够了。

Baligh Uddin answered 2019-01-27T19:01:11Z

-2 votes

只是投入另一个作为参考,因为Mark Edgars输入还有一个额外的问题,这是一个额外的例子,并涉及整个主题:

[[ `cmd` ]] && echo success_else_silence

有人表示,这与cmd || exit errcode相同。

例如。 我想确保在挂载时卸载分区:

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

Malina answered 2019-01-27T19:01:46Z

最后

以上就是欣喜黑裤为你收集整理的linux任何命令返回0,linux - 如果任何命令返回非零值,则中止shell脚本?的全部内容,希望文章能够帮你解决linux任何命令返回0,linux - 如果任何命令返回非零值,则中止shell脚本?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部