This question already has an answer here:
As a beginner, I did not find answered anywhere, the rules about spacing (grammar) and parsing.
For example.
Can I do
if [$# -eq 2] ;
then
llll
fi
or must I always have a blank or two between the objects, as
if [ $# -eq 2 ] ;
then
llll
fi
and the second related question is about the difference between
if [[ $# -eq 2 ]] ;
then
wafwaf
fi
The concern I have is about spacing before/after [
, ]
.
No searching has provided me with a set of rules.
Spaces are required after
[
and before]
.[
is actually the name of a command, an alias fortest
. It's not a special symbol, it's just a command with an unusual name.Because it's an ordinary command name and not a special character, a space is required after the
[
. If you omit the space and write[foo
the shell will search the$PATH
for a command named[foo
.For readability's sake,
[
expects its last argument to be exactly]
. Being an ordinary command-line argument,]
must have a space before it. If there's no space then the bracket will become the last character of the previous argument, and[
will complain about its last argument not being]
.[[
is a bash enhancement with more features than[
, namely saner handling of unquoted variable names. It requires the a space on both ends, same as[
. However[[
is in fact special shell syntax and is parsed differently. It's not an "ordinary command" the way[
is.For a detailed explanation of the difference between
[
and[[
, see: