Bash scripting - variabili - stringhe: differenze tra le versioni

m
mNessun oggetto della modifica
 
(6 versioni intermedie di 2 utenti non mostrate)
Riga 1: Riga 1:
{{Bash_scripting}}
{{Bash scripting}}
__TOC__
__TOC__
In '''bash''' ogni variabile di default è trattata come una stringa e, benché siano supportati anche interi e array (indicizzati o associativi), questa guida si limita al solo tipo base.
In '''bash''' ogni variabile di default è trattata come una stringa e, benché siano supportati anche interi e array (indicizzati o associativi), questa guida si limita al solo tipo base.
Riga 50: Riga 50:
VAR="valore"
VAR="valore"
readonly VAR
readonly VAR
# equivalente a:
</pre>
È equivalente a:
<pre>
readonly VAR="valore"
readonly VAR="valore"
VAR="altro valore"  # ERRORE! var ora è una costante
</pre>
</pre>
Per convenzione le costanti sono poste tutte all'inizio dello script, prima anche di eventuali definizioni delle funzioni.
Per convenzione le costanti sono poste tutte all'inizio dello script, prima anche di eventuali definizioni delle funzioni.
Riga 59: 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 77: 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