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.