A diferença entre [
e [[
é fundamental.
-
[
é um comando. Seus argumentos são processados da mesma maneira que qualquer outro argumento de comando é processado. Por exemplo, considere:[ -z $name ]
O shell expandirá
$name
e executará ambos a divisão de palavras e geração de nome de arquivo no resultado, assim como faria com qualquer outro comando.Como exemplo, o seguinte falhará:
$ name="here and there" $ [ -n $name ] && echo not empty bash: [: too many arguments
Para que isso funcione corretamente, aspas são necessárias:
$ [ -n "$name" ] && echo not empty not empty
-
[[
é uma palavra-chave shell e seus argumentos são processados de acordo com regras especiais. Por exemplo, considere:[[ -z $name ]]
O shell expandirá
$name
, mas, ao contrário de qualquer outro comando, ele não realizará nenhuma divisão de palavras nem geração de nome de arquivo no resultado. Por exemplo, o seguinte será bem-sucedido, apesar dos espaços incorporados emname
:$ name="here and there" $ [[ -n $name ]] && echo not empty not empty
Resumo
[
é um comando e está sujeito às mesmas regras que todos os outros comandos que o shell executa.
Como [[
é uma palavra-chave, não um comando, no entanto, o shell o trata especialmente e opera sob regras muito diferentes.