Bash scripting - variabili - stringhe: differenze tra le versioni

m
 
(4 versioni intermedie di uno stesso utente non sono mostrate)
Riga 60: Riga 60:
Con l'istruzione <code>read</code> è possibile assegnare a una o più variabili il contenuto di una riga dello standard input, che senza redirezioni e pipe corrisponde a ciò che viene scritto da tastiera prima di un invio.
Con l'istruzione <code>read</code> è possibile assegnare a una o più variabili il contenuto di una riga dello standard input, che senza redirezioni e pipe corrisponde a ciò che viene scritto da tastiera prima di un invio.


Sintassi (base): <code>read nomevariabile [ ... ]</code>
Sintassi (base):<br/>
:<code>read [ -r ] nomevariabile [ ... ]</code>


Il nome delle variabili non va preceduto da '''$''', proprio come nelle assegnazioni normali. Se sono presenti più nomi di variabile, la riga letta si divide in stringhe delimitate dai caratteri contenuti in <code>$IFS</code> (di default sono tre: spazio, tabulazione e invio), ma all'ultima variabile viene sempre assegnato tutto il contenuto rimanente fino a fine riga.
Il nome delle variabili non va preceduto da '''$''', proprio come nelle assegnazioni normali. Se sono presenti più nomi di variabile, la riga letta si divide in stringhe delimitate dai caratteri contenuti in <code>$IFS</code> (di default sono tre: spazio, tabulazione e invio), ma all'ultima variabile viene sempre assegnato tutto il contenuto rimanente fino a fine riga.
Il carattere <code>\</code> è speciale e può essere utilizzato per inserire in una variabile un carattere contenuto in <code>$IFS</code> e/o andare su più righe (gli "a capo" saranno rimossi però dalla variabile). Per inserirlo è una volta è quindi necessario digitare <code>\\</code>, in alternativa con l'opzione <code>-r</code> si può trattare normalmente.


Esempio:
Esempio:
<pre>
<pre>
printf %s "Scrivi qualcosa e premi invio: "
printf %s "Scrivi qualcosa e premi invio: "
read -r testo
printf %s\\n "Hai scritto: ${testo}"
</pre>
Per permettere tramite <code>\</code> di scrivere più righe, basta rimuovere l'opzione <code>-r</code>:
<pre>
printf %s "Scrivi qualcosa (se vuoi andare a capo, premi prima "\"; mentre per scrivere "\" nel testo scrivi "\\") e premi invio: "
read testo
read testo
printf %s\\n "Hai scritto: ${testo}"
printf %s\\n "Hai scritto: ${testo}" # NOTA: tutto su una riga!
</pre>
</pre>


Riga 78: Riga 88:
printf %s "Cognome, Nome, GG/MM/AAAA: "
printf %s "Cognome, Nome, GG/MM/AAAA: "
# $IFS modificata solo per la durata dell'istruzione read
# $IFS modificata solo per la durata dell'istruzione read
IFS="," read cognome nome data  # legge cognome, nome e data, rimuovendo i separatori
IFS="," read -r cognome nome data  # legge cognome, nome e data, rimuovendo i separatori
                                # a $nome assegna anche nomi multipli, finché non trova ','
                                  # a $nome assegna anche nomi multipli, finché non trova ','
# $IFS ripristinata al suo valore normale
# $IFS ripristinata al suo valore normale
</pre>
</pre>


=== Assegnazione con ciclo ===
=== Assegnazione con ciclo ===
Con l'istruzione <code>for</code> è possibile eseguire un blocco di istruzioni per ogni elemento di una lista di stringhe, assegnando un elemento per volta a una variabile. Nella sintassi ''POSIX'' è quindi equivalente al ''for each'' di alcuni linguaggi di programmazione.
Con l'istruzione <code>for</code> è possibile eseguire un blocco di istruzioni per ogni elemento di una lista di stringhe, assegnando un elemento per volta a una variabile. Nella sintassi [[POSIX]] è quindi equivalente al ''for each'' di alcuni linguaggi di programmazione.


Sintassi (base):
Sintassi (base):
3 581

contributi