Existem várias diferenças. Na minha opinião, alguns dos mais importantes são:
-
[
é um Bash embutido e muitos outros shells modernos. O[
incorporado é semelhante atest
com o requisito adicional de um]
final. Os membros incorporados[
etest
imitam a funcionalidade/bin/[
e/bin/test
, juntamente com suas limitações, para que os scripts sejam compatíveis com versões anteriores. Os executáveis originais ainda existem principalmente para compatibilidade com POSIX e compatibilidade com versões anteriores. A execução do comandotype [
no Bash indica que[
é interpretado como interno, por padrão. (Nota:which [
procura apenas executáveis no PATH e é equivalente atype -p [
) -
[[
não é compatível, não necessariamente funcionará com o que/bin/sh
apontar. Então,[[
é a opção mais moderna de Bash / Zsh / Ksh. - Como
[[
está embutido no shell e não possui requisitos legados, você não precisa se preocupar com a divisão de palavras com base na variável IFS para alterar as variáveis que avaliam para um string com espaços. Portanto, você não precisa colocar a variável entre aspas duplas.
Na maior parte, o resto é apenas uma sintaxe mais agradável. Para ver mais diferenças, recomendo este link para uma resposta de perguntas frequentes: Qual é a diferença entre o teste, [e [[? . De fato, se você é sério sobre scripts de bash, eu recomendo ler o wiki , incluindo o FAQ, Pitfalls e Guide. A seção de teste da seção de guia explica essas diferenças também, e porque o (s) autor (es) acha que [[
é uma escolha melhor se você não precisa se preocupar em ser tão portátil. As principais razões são:
- Você não precisa se preocupar em citar o lado esquerdo do teste para que ele seja lido como uma variável.
- Você não precisa escapar com% e menor que
< >
com barras invertidas para que eles não sejam avaliados como redirecionamento de entrada, o que pode realmente atrapalhar algumas coisas substituindo arquivos. Novamente, isso volta a[[
sendo um builtin. Se [(teste) for um programa externo, o shell teria que fazer uma exceção na forma como ele avalia<
e>
apenas se/bin/test
estiver sendo chamado, o que não faria muito sentido.