According to this post, [ is a builtin and [[ is a keyword. Since they can be regarded as command, everything after [ and [[ is regarded as command arguments and should be separated by spaces, until they meet final argument ] and ]]But what is the type of (( ?type ((will give an error: bash: syntax error near unexpected token `('. I found that spaces is not relevant inside (( )). echo $((1+1))echo $(( 1+1))echo $(( 1+1 ))echo $(( 1+  1))echo $(( 1  +  1  ))are all the samesummaryaccording to POSIX standard doc: Grouping Commands section If a character sequence beginning with (( would be parsed by the  shell as an arithmetic expansion if preceded by a '$', shells which  implement an extension whereby ((expression)) is evaluated as an  arithmetic expression may treat the (( as introducing as an  arithmetic evaluation instead of a grouping command. A conforming  application shall ensure that it separates the two leading '('  characters with white space to prevent the shell from performing an  arithmetic evaluation.And the arithmetic evaluation inside ((...)) is conformed with C style. So space is not relevant inside ((...))
If [ is a builtin and [[ is a keyword, then what is ((?
bash;shell;syntax
(( is not a word. Unlike [ and [[, it isn't part of the list of words that constitutes a command. The best way to think of it is as punctuation. Actually, it's two punctuation characters, which may or may not be combined in a single token depending on the context. It's similar to things like >& and || in that respect. Punctuation characters are treated in an ad-hoc way by the shell's lexer/parser.(( is half of an operator, the other half being )). Together they make the arithmetic expression operator, which has an outfix syntax. The grammatical structure of shell languages such as bash doesn't follow traditional programming language syntax very neatly (for example there are very strong ties between lexical analysis and grammatical parsing, because punctuation characters have a meaning that depends on the grammatical context), so there aren't always neatly-fitting words.type can only give you information about words that can appear in simple commands and about keywords, not about how the shell's lexer/parser works.