In Bash, I would like an if statement which is based of the exit code of running a command. For example:
#!/bin/bash
if [ ./success.sh ]; then
echo "First: success!"
else
echo "First: failure!"
fi
if [ ./failure.sh ]; then
echo "Second: success!"
else
echo "Second: failure!"
fi
success.sh
#!/bin/bash
exit 0
failure.sh
#!/bin/bash
exit 1
This should print out:
First: success!
Second: failure!
How would I achieve this? Thanks!
To display the exit code for the last command you ran on the command line, use the following command: $ echo $? The displayed response contains no pomp or circumstance. It's simply a number.
$1 means an input argument and -z means non-defined or empty. You're testing whether an input argument to the script was defined when running the script.
To check the exit code we can simply print the $? special variable in bash. This variable will print the exit code of the last run command.
Checking Bash Exit Code Launch a terminal, and run any command. Check the value of the shell variable “$?” for the exit code. $ echo $? As the “date” command ran successfully, the exit code is 0.
Just remove the brackets:
#!/bin/bash
if ./success.sh; then
echo "First: success!"
else
echo "First: failure!"
fi
if ./failure.sh; then
echo "Second: success!"
else
echo "Second: failure!"
fi
Explanation: the thing that goes between if
and then
is a command (or series of commands), the exit status of which is used to determine whether to run the then
clause, or the else
clause. This is exactly what you want.
So why do people use brackets in if
statements? It's because normally you want to decide which branch of the if
to run based on some conditional expression (is "$a"
equal to "$b"
, does a certain file exist, etc). [
is actually a command which parses its arguments as a conditional expression (ignoring the final ]
), and then exits with either success or failure depending on whether the conditional is true or false. Essentially, [ ]
functions as an adapter that lets you use conditional expressions instead of command success/failure in your if
statements. In your case, you want success/failure not a conditional expression, so don't use the adapter.
BTW, you'll also sometimes see if [[ some expression ]]; then
and if (( some expression )); then
. [[ ]]
and (( ))
are conditional expressions built into bash syntax (unlike [
, which is a command). [[ ]]
is essentially a better version of [ ]
(with some syntax oddities cleaned up and some features added), and (( ))
is a somewhat similar construct that does arithmetic expressions.
BTW2 another thing you'll see in scripts is the exit status being tested by checking the special parameter $?
, which gives the exit status of the last command. It looks like this:
somecommand
if [ $? -eq 0 ]; then
echo "Somecommand: success!"
else
echo "Somecommand: failure!"
fi
I really consider this cargo cult programming. People are used to seeing [ ]
conditional expressions in if
statements, and this idiom puts the success test in the form of a conditional expression. But let me run through how it works: it takes the exit status of the command, puts it in a conditional expression, has [ ]
evaluate that and turn it right back into an exit status so if
can use it. That whole rigamarole is unnecessary; just put the command directly in the if
statement.
In addition to the accepted answer, note that you sometimes may wish to preserve the exit status for later use. In such cases, you can save it into a variable and then test that variable.
Here is an example using your commands and the Bash arithmetic (( ))
command for tests :
#!/bin/bash
./success.sh
es1=$?
echo "exit status = $es1"
if (( es1 == 0 )); then
echo "First: success! (es1 = $es1)"
else
echo "First: failure! (es1 = $es1)"
fi
./failure.sh
es2=$?
echo "exit status = $es2"
if (( es2 > 0 )); then
echo "Second: failure! ($es2 is greater than 0)"
else
echo "Second: success!"
fi
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With