我有一个shell脚本,执行一些命令。我如何使shell脚本退出,如果任何命令退出与非零退出码?


当前回答

在Bash中,这很简单。用&&把它们连在一起:

command1 && command2 && command3

你也可以使用嵌套的if结构:

if command1
   then
       if command2
           then
               do_something
           else
               exit
       fi
   else
       exit
fi

其他回答

http://cfaj.freeshell.org/shell/cus-faq-2.html#11

How do I get the exit code of cmd1 in cmd1|cmd2 First, note that cmd1 exit code could be non-zero and still don't mean an error. This happens for instance in cmd | head -1 You might observe a 141 (or 269 with ksh93) exit status of cmd1, but it's because cmd was interrupted by a SIGPIPE signal when head -1 terminated after having read one line. To know the exit status of the elements of a pipeline cmd1 | cmd2 | cmd3 a. with Z shell (zsh): The exit codes are provided in the pipestatus special array. cmd1 exit code is in $pipestatus[1], cmd3 exit code in $pipestatus[3], so that $? is always the same as $pipestatus[-1]. b. with Bash: The exit codes are provided in the PIPESTATUS special array. cmd1 exit code is in ${PIPESTATUS[0]}, cmd3 exit code in ${PIPESTATUS[2]}, so that $? is always the same as ${PIPESTATUS: -1}. ... For more details see Z shell.

如果在Bash中只调用exit而不带任何参数,它将返回上一个命令的退出代码。结合OR, Bash应该只在前面的命令失败时调用exit。但是我还没有测试过。

command1 || exit;
command2 || exit;

Bash还将最后一个命令的退出码存储在变量$?

如果你想用$?,您将需要在每个命令后检查它,因为$?在每个命令退出后更新。这意味着如果您执行一个管道,您将只获得管道中最后一个进程的退出码。

另一种方法是这样做:

set -e
set -o pipefail

如果将它放在shell脚本的顶部,Bash似乎会为您处理它。正如前面的帖子所指出的,“set -e”将导致Bash在任何简单命令上都出错退出。"set -o pipefail"将导致Bash在管道中的任何命令上都出错而退出。

有关这个问题的更多讨论,请参见这里或这里。下面是Bash手册中关于内置设置的部分。

[ $? -eq 0 ] || exit $?; # Exit for nonzero return code

在Bash中,这很简单。用&&把它们连在一起:

command1 && command2 && command3

你也可以使用嵌套的if结构:

if command1
   then
       if command2
           then
               do_something
           else
               exit
       fi
   else
       exit
fi