Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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.

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
6  
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
7  
@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
6  
@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

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 command fails, you can use ||:

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

Or both

rm -rf somedir && trace_output "Removed the directory" || 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
1  
They are shorter and (at least in some shells) faster. I shudder remembering a monster Ultrix installation script written with just these conditional constructions I once tried to decipher... – vonbrand Dec 27 '15 at 22:15

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
4  
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
2  
There are benefits to this idiom -- it preserves the return value. In all, I find this one to be more powerful, though more verbose. it's also easier to read. – taxilian Oct 7 '15 at 21:16
    
What is "Bash's if idiom"? – Nowaker Jun 27 at 1:37

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
3  
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 '14 at 15:57
1  
@Sam-Hasler: shouldn't that be command && echo "OK" || (c=$?; echo "NOK"; (exit $c))? – jrw32982 Apr 1 '15 at 18:24
2  
Also, if the echo "OK" part could itself fail, then this is better: command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c)) – jrw32982 Apr 1 '15 at 18:34
    
@jrw32982, Nice, I've used the former construction, but not the latter. – Sam Hasler Apr 2 '15 at 16:11

This could be done simply in this way as $? gives you the status of last command executed.

So it could be

#!/bin/sh

some command

if [ $? == 0 ]
  echo '<the output message you want to display>'
else 
  echo '<failure message>'
fi
share|improve this answer

As noted elsewhere in this thread, the original question basically answers itself. Here is an illustration showing that if conditions may also be nested.

This example uses if to check if a file exists and if it is a regular file. If those conditions are true, then check whether or not it has a size greater than 0.

#!/bin/bash

echo "Which error log are you checking today? "
read answer

if [ -f /opt/logs/$answer*.errors ]
    then
        if [ -s /opt/logs/$answer*.errors ]
            then
                echo "Content is present in the $answer error log file."
            else
                echo "No errors are present in the $answer error log file."
        fi
    else
        echo "$answer does not have an error log at this time."
fi
share|improve this answer
2  
That is what your answer does, but your answer does not address the question. – Jeff Schaller Dec 24 '15 at 2:47
    
@JeffSchaller, thank you for your note. I edited my post to include a reference to the question. – quartzinquartz Dec 27 '15 at 21:00

You can do this:

if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then
  echo "ping response succsess!!!"
fi
share|improve this answer
    
That works but is convoluted. You're running ping in a subshell of a subshell, the output of ping is captured in view of running it as a command. But because the output is redirected to /dev/null that will always be the empty string. So you're running nothing in a subshell, which means the previous exit status (of the command substitution subshell, that is of ping) will be retained. Obviously, the correct way is if ping ...; then here. – Stéphane Chazelas Apr 1 '15 at 15:40

Your Answer

 
discard

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