The reason that this is a syntax error is that [
isn't part of the shell syntax; it's actually a command. Originally it was just a symlink to the test
command. It still is, but it's also a built-in command in bash and other Bourne-derived shells.
if
is a shell keyword, but the shell sees if[
, not if
. Because it didn't see an if
, it doesn't know what to do when it sees then
. (Actually, it knows exactly what to do: print a syntax error message.)
...
A bit of experimentation shows that it's not quite as simple as I thought it was. I tried creating a command called if[
and putting it in a directory in my $PATH
. When I type just if[
at the prompt, the shell asks for more input. I actually don't know what it's looking for, but apparently the [
character is specially treated by the shell. The shell just doesn't split if[
into the if
keyword and the [
command (as you might reasonably expect based on how other languages work). (If I really wanted to execute that command, I could type \if[
or "if["
-- or give it a sane name in the first place.
In any case, that last part probably doesn't matter; adding a space character will fix the problem.