1. [ -z "$var" ]
2. [ ! -n "$var" ]
3. ! [ -n "$var" ]
4. [ ! "$var" ]
5. [ "$var" = '' ]
6. [ ! "$var" != '' ]
7. [ '' = "$var" ] ... ²
São todos funcionalmente equivalentes em shells POSIX¹. O shell Bourne não tinha a palavra-chave ! , então não suportaria 3 acima e tinha todos os tipos de bugs com valores especiais de $var (como = , -n , ! ...) em todos, menos 7 ( muitos outros shells também tinham erros similares ).
Em uma veia semelhante, você pode (e deve) usar [ "$a" = "$b" ] && [ "$x" = "$y" ] no lugar de [ "$a" = "$b" -a "$x" = "$y" ] , sendo esta última obsoleta e não confiável.
O ! de 3 é um recurso de shell POSIX. Ele ainda faz sentido do utilitário test / [ para suportar seu próprio operador ! (como em 2/6) para outros shells ou aplicativos que não são shell que podem querer usá-lo e negar condições.
O utilitário test foi introduzido pelo Unix v7. Antes disso, havia um utilitário if que tinha ! , = , != , -a / -o , mas não -n / -z .
Suponho que -n / -z foram adicionados por conveniência ( test -n "$var" sendo um formato abreviado para test "$var" != '' e -z sendo adicionados para consistência)
¹ Tecnicamente, enquanto test / [ é construído virtualmente em todos os shells parecidos com o Bourne, isso não é obrigatório pelo POSIX e as primeiras versões do shell Bourne não o tinham embutido. Enquanto o shell Almquist sempre teve um test embutido, alguns BSDs não permitiram que alguns BSDs não tivessem um [ / test construído em sh até os anos 2000. Em qualquer caso, independentemente de um determinado shell ter um comando [ / test integrado, todos os sistemas POSIX também terão um comando [ / test no sistema de arquivos (que pode ou não se comportar o mesmo que o comando [ / test builtin de qualquer shell no sistema).
² Isso não quer dizer que são os únicos comandos que podem ser usados para testar se uma variável é a string vazia.
case $var in
"") ...
esac
é uma maneira que não envolve a execução de nenhum comando.
expr "x$var" : 'x$' > /dev/null
${var:+"false"}
awk 'BEGIN{exit(ARGV[1] != "")}' "$var"
[ "${#var}" -eq 0 ]
São mais exemplos de maneiras complicadas de fazer isso.
Algumas shells semelhantes a Korn, como bash , também possuem algumas construções condicionais e aritméticas incorporadas que visam substituir o comando [ ( [[ -z $var ]] , ((${#var} == 0)) ...) .