Existe alguma diferença entre [] e [[]] no bash?

exemplo:

  1. tmp1 = '1 2'tmp2 =' 1 2'se [$ tmp1 == $ tmp2], em seguida, echo "[] right" else echo "[] errado" fiif [[$ $ tmp1 == $ tmp2]] e echo "[ []] certo "mais eco" [[]] errado "fi

resultado:

  1. linha 4: [muitos argumentos [] errado [[]] certo

explicação:

[] faz

não

argumentos de escape para que a linha 4 se expanda

  1. se [1 2 == 1 2]

o que está obviamente incorreto.

Outro exemplo:

  1. qual qual [[

resultado:

  1. / usr / bin / [

explicação:

qual

comando imprime o caminho para o arquivo de comando executável ou imprime nada se falhar. [é apenas outro executável, como ls ou rm, localizado em

/ usr / bin /

diretório (na verdade, também existe o bash embutido [). [[é interno específico do bash,

então se você quiser escrever multiplataforma

ou código cross-shell evitar

[[.

Sim, e a página de manual do bash entra em detalhes excruciantes sobre isso. Aqui está um rápido resumo das diferenças em relação ao

[[]]

ponto de vista:

  • adiciona o operador correspondente = ~ regex
  • == e! = padrão para correspondência de padrões no estilo glob em vez de correspondência literal de seqüência de caracteres ... a menos que você cite o padrão no lado direito da expressão
  • compare cadeias de caracteres na ordem definida pelo seu código de idioma atual, em vez de uma simples ordem ASCII (isso pode fazer uma grande diferença ao comparar cadeias que não sejam em inglês)
  • não faz divisão de palavras e expansão de nome de caminho (o primeiro exemplo de Karpichev Roman em sua resposta ilustra os efeitos de não fazer divisão de palavras)

Como regra, eu

evitar

[[]]

a menos que eu realmente precise fazer correspondência regex ou glob. Eu explico porque