[ "$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.