No Bash, são se [-z “$ 1”] e se [“$ 1” = “”] o mesmo?

22

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

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

Eu me encontrei escrevendo o segundo em alguns roteiros, mas então eu li aqui que usa -z alcança a mesma coisa.

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

    
por Johan 07.11.2010 / 16:16

1 resposta

31

[ "$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 haja um caractere não constituinte de palavras como ; .)

[ é um shell embutido como qualquer outro; na verdade, ele também pode ser escrito test (a única diferença entre os dois é que [ requer um ] como o último argumento). Portanto, se você executar [ "$1" = "" ] com $1 expandindo para -z , o operador de teste verá três argumentos: -z , = e a sequência vazia. Alguns shell Bourne mais antigos às vezes lançavam erros de análise quando um operando se parecia com um operador dessa maneira, mesmo que não houvesse ambigüidade a expressão completa. Não sei se alguma versão de fato teve problemas com essa expressão em particular, mas expressões mais complexas poderiam jogá-las fora. Também pode ter havido versões que tiveram problemas com palavras vazias; estes não teriam suportado [ -z "$1" ] . Um idioma de shell comum é [ x"$1" = x"" ] . Evita qualquer risco de ter operandos analisados como operadores porque nenhum operador começa com uma carta.

Em ksh, bash e zsh, você pode usar a sintaxe de colchetes duplos, [[ -z $1 ]] . Essa sintaxe mais recente (que é do final dos anos 80, e não meados 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 os colchetes duplos, e você não precisa duplicar expansões variáveis.

    
por 07.11.2010 / 17:35