No Bash, se [-z "$ 1"] e se ["$ 1" = ""] são iguais?

28

No script de shell do Bash, qual é a diferença (se houver) entre as duas instruções a seguir?

    1.) if [ -z "$1" ]
    2.) if [ "$1" = "" ]

Eu me vi escrevendo o segundo em alguns scripts, mas então li aqui que o uso -zalcança a mesma coisa.

Se houver problemas ao usar o segundo, devemos ignorar que o primeiro parece um pouco melhor?

Johan
fonte
3
Para uma comparação detalhada, consulte minha resposta no Stack Overflow. Além disso, veja isso e isso .
Pausado até novo aviso.
ligações agradáveis, com algumas respostas agradáveis :)
Johan

Respostas:

36

[ "$1" = "" ]e [ -z "$1" ]são exatamente equivalentes no bash e em outros shells compatíveis com POSIX. (Observe que deve haver um espaço em cada lado dos colchetes, a menos que exista um caractere que não seja constituinte de palavras ;.)

[é um shell embutido como qualquer outro; de fato, também pode ser escrito test(a única diferença entre os dois é que [requer a ]como o último argumento). Então, se você correr [ "$1" = "" ]com $1expansão para -z, o operador teste vê três argumentos: -z, =e a cadeia vazia. Algumas conchas Bourne mais antigas às vezes lançavam erros de análise quando um operando parecia um operador dessa maneira, mesmo que não houvesse ambiguidade na expressão completa. Não sei se alguma versão realmente teve problemas com essa expressão em particular, mas expressões mais complexas poderiam desencorajá-las. Também pode ter havido versões que tiveram problemas com palavras vazias; estes também não teriam suporte [ -z "$1" ]. Um idioma comum do shell é[ x"$1" = x"" ]. Evita qualquer risco de ter operandos analisados ​​como operadores, porque nenhum operador começa com uma letra.

No ksh, bash e zsh, você pode usar a sintaxe entre colchetes [[ -z $1 ]],. Essa sintaxe mais recente (é do final dos anos 80 e não da metade dos anos 70) elimina o risco de ter operandos analisados ​​como operadores usando uma construção sintática especial em vez de um embutido comum. Os operadores devem aparecer literalmente, sem aspas, entre colchetes, e você não precisa aspas duplas nas expansões variáveis.

Gilles 'SO- parar de ser mau'
fonte
Corrigido o erro de digitação com o espaço que faltava ao lado do suporte.
Johan