How to check the exit status using an 'if' statement

BashShellIf StatementError HandlingExit Code

Bash Problem Overview


What would be the best way to check the exit status in an if statement in order to echo a specific output?

I'm thinking of it being:

if [ $? -eq 1 ] 
then
    echo "blah blah blah"
fi

The issue I am also having is that the exit statement is before the if statement simply because it has to have that exit code. Also, I know I'm doing something wrong since the exit would obviously exit the program.

Bash Solutions


Solution 1 - Bash

Every command that runs has an exit status.

That check is looking at the exit status of the command that finished most recently before that line runs.

If you want your script to exit when that test returns true (the previous command failed) then you put exit 1 (or whatever) inside that if block after the echo.

That being said, if you are running the command and are wanting to test its output, using the following is often more straightforward.

if some_command; then
    echo command returned true
else
    echo command returned some error
fi

Or to turn that around use ! for negation

if ! some_command; then
    echo command returned some error
else
    echo command returned true
fi

Note though that neither of those cares what the error code is. If you know you only care about a specific error code then you need to check $? manually.

Solution 2 - Bash

Note that exit codes != 0 are used to report errors. So, it's better to do:

retVal=$?
if [ $retVal -ne 0 ]; then
    echo "Error"
fi
exit $retVal

instead of

# will fail for error codes == 1
retVal=$?
if [ $retVal -eq 1 ]; then
    echo "Error"
fi
exit $retVal

Solution 3 - Bash

An alternative to an explicit if statement

Minimally:

test $? -eq 0 || echo "something bad happened"

Complete:

EXITCODE=$?
test $EXITCODE -eq 0 && echo "something good happened" || echo "something bad happened";
exit $EXITCODE

Solution 4 - Bash

$? is a parameter like any other. You can save its value to use before ultimately calling exit.

exit_status=$?
if [ $exit_status -eq 1 ]; then
    echo "blah blah blah"
fi
exit $exit_status

Solution 5 - Bash

For the record, if the script is run with set -e (or #!/bin/bash -e) and you therefore cannot check $? directly (since the script would terminate on any return code other than zero), but want to handle a specific code, @gboffis comment is great:

/some/command || error_code=$? if [ "${error_code}" -eq 2 ]; then ...

Solution 6 - Bash

Just to add to the helpful and detailed answer:

If you have to check the exit code explicitly, it is better to use the arithmetic operator, (( ... )), this way:

run_some_command
(($? != 0)) && { printf '%s\n' "Command exited with non-zero"; exit 1; }

Or, use a case statement:

run_some_command; ec=$?  # grab the exit code into a variable so that it can
                         # be reused later, without the fear of being overwritten
case $ec in
    0) ;;
    1) printf '%s\n' "Command exited with non-zero"; exit 1;;
    *) do_something_else;;
esac

Related answer about error handling in Bash:

Solution 7 - Bash

If you are writing a function – which is always preferred – you can propagate the error like this:

function()
{
    if <command>; then
        echo worked
    else
        return
    fi
}

Now, the caller can do things like function && next as expected! This is useful if you have a lot of things to do in the if block, etc. (otherwise there are one-liners for this). It can easily be tested using the false command.

Solution 8 - Bash

Using Z shell (zsh) you can simply use:

if [[ $(false)? -eq 1 ]]; then echo "yes" ;fi

When using Bash and set -e is on, you can use:

false || exit_code=$?
if [[ ${exit_code} -ne 0 ]]; then echo ${exit_code}; fi

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questiondeadcell4View Question on Stackoverflow
Solution 1 - BashEtan ReisnerView Answer on Stackoverflow
Solution 2 - BashOo.oOView Answer on Stackoverflow
Solution 3 - BashCatskulView Answer on Stackoverflow
Solution 4 - BashchepnerView Answer on Stackoverflow
Solution 5 - BashdtkView Answer on Stackoverflow
Solution 6 - BashcodeforesterView Answer on Stackoverflow
Solution 7 - BashNishantView Answer on Stackoverflow
Solution 8 - BashAviel YosefView Answer on Stackoverflow