重击:如果command1失败,请运行command2


43

我想做这样的事情:

if cmd1 && cmd2
echo success
else
echo epic fail
fi

我该怎么办?


1
您只是在“回声成功”命令之前缺少了“ then”关键字。
glenn jackman 2011年

10
嗯 您的伪代码似乎提出了与标题中的问题不同的问题.....
mattdm

一些shell脚本退出条件的好资源pixelbeat.org/programming/shell_script_mistakes.html
Flashman

Answers:


71

这些应该可以满足您的需求:

cmd1 && cmd2 && echo success || echo epic fail

要么

if cmd1 && cmd2; then
    echo success
else
    echo epic fail
fi

3
这有效,但是我很困惑为什么||不看第一个echo命令的输出。
mlissner

1
@mlissner,如果不是,则期望退出代码;如果在命令处启动,则返回0,如果错误,则返回1。不要读取输出。Just try whoami && whoami && echo success || echo epic fail现在whoami && whoareyou && echo success || echo epic fail。我无法弄清楚“不看第一个echo命令的输出”是什么意思
erm3nda

@mlissner我想我有您的问题,但答案是echo命令永远不会失败。也就是说,其返回值将为0,即为真。因此,真正重要的条件是cmd1 && cmd2
Kazim Zaidi

22

彼得·乌泽尔(Petr Uzel)随处可见,但您也可以玩魔术$?。

$?保留最后执行的命令的退出代码,如果使用此代码,则可以非常灵活地编写脚本。

这个问题有点触及这个话题,使用$的最佳实践?b?

cmd1 
if [ "$?" -eq "0" ]
then
  echo "ok"
else
  echo "Fail"
fi

然后,您还可以对不同的退出代码做出反应,并根据需要执行不同的操作。


1
我的公司PHP Experts,Inc.和我本人要感谢您成为我们内部CI脚本不可或缺的一部分。谢谢!
西奥多·R·史密斯

7

问题中的伪代码与问题的标题不对应。

如果有人在命令1失败时实际上需要知道如何运行命令2,这是一个简单的解释:

  • cmd1 || cmd2:这将运行cmd1,并且在失败的情况下将运行cmd2
  • cmd1 && cmd2:这将运行cmd1,如果成功,它将运行cmd2
  • cmd1 ; cmd2:这将运行cmd1,然后运行,而与运行cmd2的失败或成功无关cmd1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.