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 for test. It's not a special symbol, it's just a command with an unusual name.
$ help '['
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.
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.
$ [ foo = foo ] && echo true
true
$ [foo = foo] && echo true
[foo: command not found
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 ].
$ [ foo = foo]
bash: [: missing `]'
$ [ foo = 'foo]'
bash: [: missing `]'
[[ 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:
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