96

I want to do something like this:

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

How should I do it?

Jeff Schaller
  • 66,199
  • 35
  • 114
  • 250
michelemarcon
  • 3,357
  • 10
  • 32
  • 37

3 Answers3

133

These should do what you need:

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

or

if cmd1 && cmd2; then
    echo success
else
    echo epic fail
fi
Petr Uzel
  • 7,157
  • 4
  • 30
  • 26
  • 4
    This works, but I'm confused why `||` doesn't look at the output of the first `echo` command. – mlissner Aug 19 '15 at 21:32
  • 1
    @mlissner, the if else expects to exit codes, 0 if the command where launched and 1 if where errors. Do not read at the output. `Just try whoami && whoami && echo success || echo epic fail` and now `whoami && whoareyou && echo success || echo epic fail`. I cant figure out what you mean by "doesn't look at the output of the first echo command" – m3nda Feb 09 '16 at 14:41
  • 1
    @mlissner I think I got your question, but the answer is that echo command won't fail ever. That is, its return will be 0, i.e. truthy. So the condition that really matters is just `cmd1 && cmd2` – Kazim Zaidi Aug 23 '17 at 11:25
  • `printf "$(( 1/0 ))" || echo "failed"` does not work. However, putting `printf "$(( 1/0 ))"` in step_1.sh, then running `./step_1.sh || echo "failed"` behaves as expected. – Wassadamo Aug 23 '22 at 05:29
110

The pseudo-code in the question does not correspond to the title of the question.

If anybody needs to actually know how to run command 2 if command 1 fails, this is a simple explanation:

  • cmd1 || cmd2: This will run cmd1, and in case of failure it will run cmd2
  • cmd1 && cmd2: This will run cmd1, and in case of success it will run cmd2
  • cmd1 ; cmd2: This will run cmd1, and then it will run cmd2, independent of the failure or success of running cmd1.
32

Petr Uzel is spot on but you can also play with the magic $?.

$? holds the exit code from the last command executed, and if you use this you can write your scripts quite flexible.

This questions touches this topic a little bit, Best practice to use $? in bash? .

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

Then you also can react to different exit codes and do different things if you like.

Johan
  • 4,523
  • 2
  • 26
  • 33