No bash, os três elementos que você pergunta são semelhantes aos comandos:
- Todos os
[ [[ e (( podem ser a primeira "palavra" de uma linha de comando.
É claro que o resto da linha deve corresponder à sintaxe válida.
-
Todos têm ajuda do próprio shell:
A [ :
$ 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 '['.
A [[ :
$ help [[
[[ ... ]]: [[ expression ]]
Execute conditional command.
…
…
E um (( (deve ser citado para ser corretamente reconhecido):
$ help '(('
(( ... )): (( expression ))
Evaluate arithmetic expression.
The EXPRESSION is evaluated according to the rules for arithmetic
evaluation. Equivalent to "let EXPRESSION".
Exit Status:
Returns 1 if EXPRESSION evaluates to 0; returns 0 otherwise.
No entanto, A (( é realmente um iniciador de um "Comando Composto".
Pode se estender por várias linhas, muito parecido com um if :
$ ((
> 2+2
> ))
$ if
> true
> then
> echo yes
> fi
yes
Não pode ser dividido em dois caracteres (coloque um espaço entre os dois ( ) e permaneça uma "Expressão Aritmética". O uso de um espaço é necessário no POSIX para garantir a análise correta de Grouping Commands . Ou seja: converta o (( em dois% independentes (list) .
Esse é o mesmo efeito que dividir um if nos caracteres i e f (altera a maneira como o shell interpreta os comandos):
$ i f
i: command not found
Se (( for dividido, ele se tornará um par de (list) :
(list) list is executed in a subshell environment
E (( não requer espaços ao redor para ser reconhecido (diferente de if ):
$ (w);((a=33))&&((b=34));echo $a $b
… …
33 34
O (( divide a linha em "tokens" por si só.
A chamada de uma pontuação " (( " é tão razoável quanto chamar uma if "pontuação".
Você pode pesquisar dentro de man bash por \(\( ou usar esta linha de pesquisa (pressione n para acessar as próximas instâncias uma vez dentro do manual):
$ LESS=+/'\(\(' man bash
No entanto, também faz parte de uma "Expansão Aritmética", que é iniciada pela presença de um $ primeiro e faz parte do (também) "Comando Composto":
for (( expr1 ; expr2 ; expr3 )) ; do list ; done
Também é importante observar que um simples ( é um metacaractere (divisor de linhas de comando em palavras antes de iniciar a análise). Portanto, um ( com um espaço significa algo diferente de dois (( juntos.
Em ksh, a sintaxe válida a (( pode ser parte do for loop, também, é definida como algo diferente de um comando simples ((expression)) , parte de uma Expansão Aritmética $((…)) e parte do posicionamento FD <#((expr)) e >#((expr)) .
Em zsh, (( … )) é definido como se fosse um argumento de let e é considerado um argumento "cotado" avaliado como uma expressão aritmética. (Parece o mesmo que para ksh ou bash se você me pedir uma opinião). Além disso, em zsh há uma diferença para "Qualificadores Globais", em que um% (( significa algo diferente:
for example (^x)', can be forced to be treated as part of the glob pattern by doubling the parentheses, in this case producing((^x))'.
Não consegui encontrar uma regra de trabalho simples para analisar esse uso.