De man bash
:
-n string
True if the length of string is non‐zero.
Exemplos:
# expected
$ var=""; [ -n "$var" ]; echo $?
1
# unexpected?
$ var=""; [ -n $var ]; echo $?
0
Aqui vemos que -n
com uma variável sem aspas contendo uma string vazia retorna verdadeiro. Por que?
Por que é $var
necessário ser citado aqui?
O sinal $ introduz expansão de parâmetros, substituição de comandos ou expansão aritmética
No seu segundo caso (
$var
sem aspas), pois$var
está vazio, ele será expandido para nada. Como se você não tivesse especificado nenhum operando para o teste.No seu primeiro caso, (
$var
aspas duplas)$var
ainda será expandido para nada além de aspas duplas, fornecendo incidentalmente a string vazia""
como operando para o teste.Atualize a seguinte pergunta adicional do OP nos comentários :
Ao que eu inicialmente respondi que, de acordo com o manual , teste
Com false incluindo o caso em que "um argumento inválido é fornecido" .
Alguns comentários de illkachu fornecem uma visão mais profunda:
No entanto :