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 $test
fosse 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 $test
fosse "*" o "= pippo" ...
In [ -n "$test" ]
, [
è passato i quattro argomenti "["
, "-n"
, ""
e "]"
(senza le virgolette), che è quello che vogliamo.
Che sia echo
o [
non faccia alcuna differenza, è solo che echo
genera 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.