如果命令失败,如何退出?
我是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; }