In an attempt to stay consistent i have tried to use double brackets [[ ]] in all my if statements. I did however get into a problem when i was going to check the return value for a command i wanted to run. After testing several ways of creating an if statement i found that only without brackets could i execute a command.
The following does not work:
if [[ $command ]] ; then
echo "something"
fi
if [[ $(command) ]] ; then
echo "something"
fi
if [[ ${command} ]] ; then
echo "something"
fi
and the code above makes the if loop true even when the command was not run. since the code above doesnt work with braces it doesnt work to use this either:
[[ $command ]] || echo "failed"
and it doesnt work in a subshell either.
The following works:
if $command ; then
echo "something"
fi
if $(command) ; then
echo "something"
fi
Why doesnt it work to place a command in an if loop with brackets, and why does the if loops above report true when it didnt even run the command ? I'm using bash version 4.1.9. Ive tried this many times and the if loops are just as simple as the ones i typed above, it just checks if a command was run successfully and exits if it wasnt.
If you're just checking the return value of the command, drop the double brackets.
The double brackets are a test command. (Well, not really, but their a takeoff of the single square brackets that were an alias to the
test
command.) In early Bourne shell, you would see things like:The square brackets were syntactic sugar:
So, if you're not doing an actual test, you can eliminate the double or single square brackets.
If you're using square brackets, you should use the double ones and not the single ones because the double ones are a bit more forgiving and can do a bit more:
The short answer is:
[
and[[
expect an expression.if
expects a command.Saying:
would essentially execute:
which may or may not be what you want. On the other hand, saying:
would echo
something
orother
based on the return code of the command (0
and non-zero respectively).Double braces are a shortcut for
test
. In your examples, what's happening is that you're testing the shell variable $command for existence.In your second example, you're using command substitution to check that
command
output something on standard output.Your third example is the same as your first, pretty much. You use the curly braces if you want to group your variables. for example if you want to put an 's' after something.
Then in your fifth example, you are running the program that is sitting inside
command
.So, if you want to test some strings, use [[ ]] or [ ]. If you just want to test the exit status of a program, then don't use those, just use a bare if.
Check
man test
for details on the braces.