Você sempre precisa de aspas em torno de variáveis em todos os contextos de lista , ou seja, em todos os lugares a variável pode ser expandida para vários valores, a menos que você queira os três efeitos colaterais de deixar uma variável sem aspas.
Os contextos de lista incluem argumentos para comandos simples como [ou echo, as for i in <here>atribuições a matrizes ... Existem outros contextos em que as variáveis também precisam ser citadas. O melhor é sempre citar variáveis, a menos que você tenha uma boa razão para não fazê-lo.
Pense na ausência de aspas (em contextos de lista) como o operador split + glob .
Como se echo $testfosse echo glob(split("$test")).
O comportamento do shell é confuso para a maioria das pessoas, porque na maioria das outras linguagens, você coloca aspas em torno de cadeias fixas, como puts("foo"), e não em torno de variáveis (como puts(var)), enquanto no shell é o contrário: tudo é string em shell, colocando aspas em tudo seria complicado, você echo test, você não precisa "echo" "test". No shell, as aspas são usadas para outra coisa: impedir algum significado especial de alguns caracteres e / ou afetar o comportamento de algumas expansões.
Em [ -n $test ]ou echo $test, o shell é dividido $test(em branco por padrão) e, em seguida, executa a geração do nome do arquivo (expanda todos os *padrões '?' ... para a lista de arquivos correspondentes) e passa essa lista de argumentos para os comandos [ou echo.
Mais uma vez, pense nisso como "[" "-n" glob(split("$test")) "]". Se $testestiver vazio ou contiver apenas espaços em branco (spc, tab, nl), o operador split + glob retornará uma lista vazia, então [ -n $test ]será "[" "-n" "]", que é um teste para verificar se "-n" é a sequência vazia ou não. Mas imagine o que teria acontecido se $testfosse "*" ou "= foo" ...
Em [ -n "$test" ], [é passado os quatro argumentos "[", "-n", ""e "]"(sem as aspas), que é o que queremos.
Se é echoou [não faz diferença, é exatamente isso que echoproduz a mesma coisa, seja passado um argumento vazio ou nenhum argumento.
Consulte também esta resposta a uma pergunta semelhante para obter mais detalhes sobre o [comando e a [[...]]construção.
echo, espaços extras e novas linhas serão removidos.