O colchete único é a forma tradicional e geralmente é implementado como um comando externo. O colchete duplo é uma extensão bash (e ksh e zsh), não é no POSIX e tem a vantagem de uma sintaxe mais limpa (veja abaixo) e não usa um processo separado.
Uma das diferenças de sintaxe é que <
e >
operadores (nota: não padrão POSIX) não precisam ser ignorados ou citados para evitar a leitura como um operador de redirecionamento. Além disso, [
requer alguns truques no caso de uma das cadeias poder estar vazia ou começar com um hífen. É por isso que você vê os scripts fazendo algo como [ "x$ASD" == xValue ]
, enquanto que com o bash eles poderiam simplesmente usar [[ $ASD == Value ]]
. Note que o truque "x" não é estritamente necessário com um comando compatível com POSIX testando apenas uma coisa, veja esta questão para mais detalhes sobre isso.
O bash FAQ tem mais informações sobre as diferenças. Isso também foi respondido em outro site de troca de pilhas.