Bash scripting: differenze tra le versioni

m
Riga 43: Riga 43:
Con l'unica eccezione dell'assegnazione, quando si accede al contenuto di una variabile senza quotarla, questa può essere trasformata in più di una singola stringa ('''esplosione'''), in base agli spazi contenuti, e perfino in "niente" se è vuota ("niente" proprio come se non presente nel codice). '''Entrambi i comportamenti non sono intuitivi e costituiscono una comune sorgente di errori'''.
Con l'unica eccezione dell'assegnazione, quando si accede al contenuto di una variabile senza quotarla, questa può essere trasformata in più di una singola stringa ('''esplosione'''), in base agli spazi contenuti, e perfino in "niente" se è vuota ("niente" proprio come se non presente nel codice). '''Entrambi i comportamenti non sono intuitivi e costituiscono una comune sorgente di errori'''.


Se si vuole sempre considerare il contenuto della variabile come una singola stringa, è necessario accederla quotata (tra virgolette), ossia con <code>"$variabile"</code> oppure <code>"${variabile}"</code>.
Se si vuole sempre considerare il contenuto della variabile come una singola stringa, è necessario accederla quotata (tra virgolette), ossia con <code>"$variabile"</code> oppure <code>"${variabile}"</code>. Si considerino per esempio i seguenti confronti (usati in genere con <code>if</code>, <code>while</code>, ...):
<pre>
[ $var = $var2 ]    # SBAGLIATO! (se una delle due è vuota)
[ "$var" = "$var2" ] # corretto
[ -n $var ]          # SBAGLIATO (se var è vuota)
[ -n "$var" ]        # corretto
</pre>


Questo fatto è di particolare importanza quando si utilizza una variabile in una condizione (<code>[ ... ]</code>, <code>test ...</code>, ecc...), perché la variabile potrebbe essere sostituita da più di una stringa o perfino da nessuna. E lo è ancora di più quando si passa la variabile a un comando, in particolare se questo agisce su un file indicato dalla variabile, il cui contenuto potrebbe venir trattato come una lista di file in presenza di spazi (cosa molto comune per i file degli utenti).
Questo fatto è ancora più importante quando si passa la variabile a un comando, in particolare se questo agisce su un file indicato dalla variabile, il cui contenuto in presenza di spazi (comuni per i nomi di file degli utenti) potrebbe venir trattato come una lista di file.


Esempio di codice che crea un backup di un file indicato da una variabile, se il suo nome non termina già con estensione .bak. Si notino le virgolette attorno alla variabili, omesse solo nelle assegnazioni (senza spazi), per garantire che ogni variabile venga espansa in uno e un solo argomento:
Esempio di codice che crea un backup di un file indicato da una variabile, se il suo nome non termina già con estensione .bak. Si notino le virgolette attorno alla variabili, omesse solo nelle assegnazioni (senza spazi), per garantire che ogni variabile venga espansa in uno e un solo argomento:
3 581

contributi