É muito simples. Você só precisa entender []
, [[]]
e (())
como animais completamente diferentes.
[ expression ]
é apenas uma invocação de um programa [
(apenas um nome diferente para test
) e usa a expressão como argumentos, assim como para todas as chamadas de comandos no bash. Isso significa que você deve usar espaços em branco entre os argumentos, especialmente depois de [
e antes de ]
, e palavras-chave e caracteres especiais precisam ser escapados ou citados, e as variáveis são expandidas da maneira usual.
Dentro da expressão, -gt, -lt
e relacionados são usados para comparação numérica, enquanto >, <
e a classificação são para comparações de cadeias. Pense em [
como nada a ver com bash, apenas chamando um comando que avalia expressões e retorna 0 (verdadeiro) ou diferente de zero (falso), como todos os programas fazem.
Operadores booleanos &&
e ||
não podem ser usados lá, porque são interpretados pelo bash e não passados para test
como argumentos. -a
e -o
são usados no lugar. Mas você sempre pode fazer [ test1 ] && [ test2 ] || [ test3 ]
, que são 3 invocações de teste, combinadas pelos operadores booleanos comuns de bash
(ou seja, se falhar primeiro, o segundo é ignorado).
Observe que bash
ainda vem com sua própria implementação de [
(builtin), mas isso não muda a maneira como é tratado sintaticamente.
[[ ]]
e (( ))
não são substitutos internos para comandos, mas partes de uma sintaxe especial, portanto, regras diferentes se aplicam. Veja man page para detalhes sobre como os nomes das variáveis são curingas são tratados lá. Operadores booleanos &&
e ||
têm o significado usual.
O [[ ]]
one é centrado em string: todos os comparsions são para strings (mas são mais "modernos", com reconhecimento de localidade do que em [
, embora test
possa ser dependente da plataforma). Ele também lida com testes de arquivos, regex e assim por diante.
O (( ))
é para expressões aritméticas. Nomes de variáveis não requerem $
, e você pode simplesmente escrever expressões matemáticas lá - isso, claro, inclui comparações (que são numéricas). Comparações neste caso não são diferentes de qualquer outra expressão aritmética, true é 1, false é 0 e você pode escrever coisas como (( x=y*(z>4) ))
. Se usado em uma expressão condicional, o valor diferente de zero é verdadeiro e zero é falso. Você também pode capturar o resultado como $(( ))
.
Então:
-
[[ ]]
condicionais de string, correspondência de padrões e testes de arquivo -
(( ))
expressões aritméticas e condicionais -
[ ]
test comando : lida com ambas as sintaxes especiais não padrão para operadores booleanos e operadores de comparação