Bash tips: differenze tra le versioni

m
Riga 188: Riga 188:


In Bash ogni variabile (di default) è trattata come una stringa, e un nome di variabile ammette soltanto caratteri alfabetici (maiuscoli e minuscoli), l'underscore "_" e numeri (questi ultimi purché non in prima posizione).
In Bash ogni variabile (di default) è trattata come una stringa, e un nome di variabile ammette soltanto caratteri alfabetici (maiuscoli e minuscoli), l'underscore "_" e numeri (questi ultimi purché non in prima posizione).
Si indica dunque con <code>${nome}</code> oppure con la forma abbreviata <code>$nome</code>. Si noti che la forma abbreviata considera il nome della variabile come composto da tutti i caratteri validi incontrati (per esempio <code>"$nome$cognome"</code> è equivalente a <code>"${nome}${cognome}"</code>, ma <code>"$nome_$cognome"</code> non lo è a <code>"${nome}_${cognome}"</code> perché <code>nome_</code> sarebbe un nome di variabile valido). In caso di concatenazione di variabili è preferibile accedere alle variabili con le graffe, o in alternativa delimitare dalle virgolette o da un carattere '''\''' (per esempio: <code>"$nome"_"$cognome"</code> e <code>"$nome\_$cognome"</code> corrisponde a <code>"${nome}_${cognome}"</code>).
Si accede dunque con <code>${nome}</code> oppure con la forma abbreviata <code>$nome</code>. Si noti che la forma abbreviata considera il nome della variabile come composto da tutti i caratteri validi incontrati (per esempio <code>"$nome$cognome"</code> è equivalente a <code>"${nome}${cognome}"</code>, ma <code>"$nome_$cognome"</code> non lo è a <code>"${nome}_${cognome}"</code> perché <code>nome_</code> sarebbe un nome di variabile valido). In caso di concatenazione di variabili è preferibile accedere alle variabili con le graffe, o in alternativa delimitare dalle virgolette o da un carattere '''\''' (per esempio: <code>"$nome"_"$cognome"</code> e <code>"$nome\_$cognome"</code> corrisponde a <code>"${nome}_${cognome}"</code>).


Nelle assegnazioni è superfluo l'uso delle virgolette, salvo concatenazioni e spazi in cui è preferibile l'uso di virgolette e graffe:
Nelle assegnazioni non si deve usare il <code>'''$'''</code>, salvo che per accedere al contenuto di altre variabili. Ed è superfluo anche l'uso delle virgolette, salvo concatenazioni e spazi in cui è preferibile assieme all'uso delle graffe:
<pre> variable=stringa                          # assegno un valore (una stringa)
<pre> variable=stringa                          # assegno un valore (una stringa)
  variabile="stringa con spazi"            # assegno una stringa con spazi
  variabile="stringa con spazi"            # assegno una stringa con spazi
Riga 197: Riga 197:
  variabile="${var1} testo ${var2}_${var3}" # assegno una concatenazione di variabili e stringhe
  variabile="${var1} testo ${var2}_${var3}" # assegno una concatenazione di variabili e stringhe
</pre>
</pre>
ma è bene notare che in tutti gli altri casi, quando si accede al contenuto di una variabile senza quotarla, questa può essere trasformata in più di una singola stringa, in base agli spazi contenuti, e perfino in "niente" se è vuota ("niente" proprio come se non presente nel codice). Se invece 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>.


Questo fatto è di particolare importanza quando si utilizza la variabile in una condizione ([ ... ], test ..., ecc...), perché la variabile potrebbe essere sostituita da più di una stringa o perfino da nessuna; e anche quando la si passa a un comando, in particolare se agisce su un file indicato dalla variabile, che potrebbe venir trattato come più di un file. L'utilità nel non quotarla d'altra parte consiste nella possibilità di assegnare tutte le opzioni da passare a un comando, se sono stringhe senza spazi, a una singola variabile, così da passare al comando tutte le stringhe (o nessuna stringa se lasciata vuota) in una volta sola.
È bene notare che in tutti gli altri casi, quando si accede al contenuto di una variabile senza quotarla, questa può essere trasformata in più di una singola stringa, in base agli spazi contenuti, e perfino in "niente" se è vuota ("niente" proprio come se non presente nel codice). 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>.
 
Questo fatto è di particolare importanza, e una comune sorgente di errori, quando si utilizza la 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 anche quando la si passa a un comando, in particolare se agisce su un file indicato dalla variabile, che potrebbe venir trattato come più di un file. L'utilità nel non quotarla d'altra parte consiste nella possibilità di assegnare tutte le opzioni da passare a un comando, se sono stringhe senza spazi, a una singola variabile, così da passare al comando tutte le stringhe (o nessuna stringa se lasciata vuota) in una volta sola.


=== Manipolazione delle stringhe ===
=== Manipolazione delle stringhe ===
3 581

contributi