Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

How can I do something like this in bash?

if "`command` returns any error";
then
    echo "Returned an error"
else
    echo "Proceed..."
fi
share|improve this question

migrated from programmers.stackexchange.com Oct 16 '11 at 22:29

This question came from our site for professional programmers interested in conceptual questions about software development.

add comment

4 Answers

That's exactly what bash's if statement does:

if command ; then
    echo "Command succeeded"
else
    echo "Command failed"
fi

Adding information from comments: you don't need to use the [ ... ] syntax in this case. [ is itself a command, very nearly equivalent to test. It's probably the most common command to use in an if, which can lead to the assumption that it's part of the shell's syntax. But if you want to test whether a command succeeded or not, use the command itself directly with if, as shown above.

share|improve this answer
    
Note that the semicolon is important. –  Thorbjørn Ravn Andersen Oct 17 '11 at 7:37
2  
Or you can just put then on a separate line. –  l0b0 Oct 17 '11 at 9:00
    
For the negative that the Op wants: if [ ! command ] ; then ... –  Joe Oct 22 '11 at 14:05
1  
@Joe: I think you mean if ! command ; then ... ; fi. [ is itself a command, and it's not needed in this case. –  Keith Thompson Jan 13 '12 at 10:19
1  
@Joe: My way also has the virtue of being correct. if [ ! command ] doesn't execute command; it treats command as a string and treats it as true because it has a non-zero length. [ is a synonym for the test command –  Keith Thompson Jan 14 '12 at 9:36
show 2 more comments

For small things that you want to happen if a shell command works, you can use the && construct:

rm -rf somedir && trace_output "Removed the directory"

Similarly for small things that you want to happen when a shell comand fails, you can use ||:

rm -rf somedir || exit_on_error "Failed to remove the directory"

It's probably unwise to do very much with these constructs, but they can on occasion make the flow of control a lot clearer.

share|improve this answer
add comment

Check the value of $?, which contains the result of executing the most recent command/function:

#!/bin/bash

echo "this will work"
RESULT=$?
if [ $RESULT -eq 0 ]; then
  echo success
else
  echo failed
fi

if [ $RESULT == 0 ]; then
  echo success 2
else
  echo failed 2
fi
share|improve this answer
    
While technically correct (and thus not warranting a downvote), it's not making use of Bash's if idiom. I prefer Keith Thompson's answer. –  janmoesen Oct 17 '11 at 11:30
add comment

This worked for me:

command && echo "OK" || echo "NOK"

if command succeeds, then echo "OK" is executed, and since it's successful, execution stops there. Otherwise, && is skipped, and echo "NOK" is executed.

share|improve this answer
1  
If you want to do something if it fails, and preserve the exit code (to show in command prompt or test in a script), you can do this: command && echo "OK" || c=$?; echo "NOK"; $(exit $c) –  Sam Hasler Jun 24 at 15:57
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.