Hai sempre bisogno di virgolette attorno alle variabili in tutti i contesti di elenco , ovvero ovunque la variabile possa essere espansa su più valori a meno che tu non voglia i 3 effetti collaterali di lasciare una variabile non quotata.
i contesti di lista includono argomenti per comandi semplici come [o echo, i for i in <here>, assegnazioni ad array ... Ci sono altri contesti in cui è necessario anche citare le variabili. La cosa migliore è citare sempre le variabili a meno che tu non abbia una buona ragione per non farlo.
Pensa all'assenza di virgolette (nei contesti di elenco) come l' operatore split + glob .
Come se lo echo $testfosse echo glob(split("$test")).
Il comportamento della shell è confuso per la maggior parte delle persone perché nella maggior parte delle altre lingue, metti le virgolette attorno a stringhe fisse, come puts("foo")e non attorno a variabili (come puts(var)) mentre nella shell è il contrario: tutto è stringa nella shell, quindi metti le virgolette intorno a tutto sarebbe ingombrante, tu echo test, non è necessario "echo" "test". Nella shell, le virgolette sono usate per qualcos'altro: prevenire qualche significato speciale di alcuni personaggi e / o influenzare il comportamento di alcune espansioni.
In [ -n $test ]o echo $test, la shell si dividerà $test(sugli spazi vuoti per impostazione predefinita), quindi eseguirà la generazione del nome del file (espandi tutti i *modelli, "?" ... all'elenco dei file corrispondenti), quindi passerà tale elenco di argomenti ai comandi [o echo.
Ancora una volta, pensalo come "[" "-n" glob(split("$test")) "]". Se $testè vuoto o contiene solo spazi vuoti (spc, tab, nl), l'operatore split + glob restituirà un elenco vuoto, quindi lo [ -n $test ]sarà "[" "-n" "]", che è un test per verificare se "-n" è la stringa vuota o meno. Ma immagina cosa sarebbe successo se $testfosse "*" o "= pippo" ...
In [ -n "$test" ], [è passato i quattro argomenti "[", "-n", ""e "]"(senza le virgolette), che è quello che vogliamo.
Che sia echoo [non faccia alcuna differenza, è solo che echogenera la stessa cosa, indipendentemente dal fatto che abbia passato un argomento vuoto o nessun argomento.
Vedi anche questa risposta a una domanda simile per maggiori dettagli sul [comando e sul [[...]]costrutto.
echo, gli spazi extra e le nuove righe verrebbero rimossi.