如果命令失败,如何退出?

我是shell脚本的noob。 如果命令失败,我想打印一条消息并退出我的脚本。 我试过了:

my_command && (echo 'my_command failed; exit) 

但它不起作用。 它继续执行脚本中此行后面的指令。 我使用Ubuntu和bash。

尝试:

 my_command || { echo 'my_command failed' ; exit 1; } 

四个变化:

  • &&更改为||
  • 使用{ }代替( )
  • 介绍; exit
  • {之前和之后的空格

既然你想打印消息,并且只有在命令失败时退出(以非零值退出),你需要一个|| 不是&&

 cmd1 && cmd2 

将在cmd1成功时运行cmd2 (退出值0 )。 在哪里

 cmd1 || cmd2 

将在cmd1失败(退出值非零)时运行cmd2

使用( )使得它们内部的命令在子shell中运行,并从那里调用一个exit会导致你退出子shell而不是原来的shell,因此在你的原始shell中继续执行。

为了克服这个使用{ }

最后两个更改是由bash所要求的。

其他答案已经涵盖了直接的问题,但是您也可能对使用set -e感兴趣。 因此,任何失败的命令(除了特定的上下文之外, iftesting)都将导致脚本中止。 对于某些脚本,这是非常有用的。

另请注意,每个命令的退出状态都存储在shellvariables$?中,您可以在运行该命令后立即检查该variables。 非零状态表示失败:

 my_command if [ $? -eq 0 ] then echo "it worked" else echo "it failed" fi 

如果你想要脚本中的所有命令的行为,只需添加

  set -e set -o pipefail 

在剧本的开始。 这一对选项告诉bash解释器每当命令返回一个非零的退出代码就退出。

尽pipe如此,这不允许您输出退出消息。

我捣毁了下面的习语:

 echo "Generating from IDL..." idlj -fclient -td java/src echo.idl if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi echo "Compiling classes..." javac *java if [ $? -ne 0 ]; then { echo "Failed, aborting." ; exit 1; } fi echo "Done." 

在每个命令前加一个内容丰富的回声,然后按照每一个命令
if [ $? -ne 0 ];... if [ $? -ne 0 ];...行。 (当然,如果你愿意,你可以编辑这个错误信息。)

提供的my_command是正则devise的, 成功返回0,那么&&正好与你想要的相反。 你想||

另外请注意(在bash中我看起来并不正确,但我不能从我的位置去尝试,告诉我。

 my_command || { echo 'my_command failed' ; exit 1; }