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