Bash scripting: differenze tra le versioni

ristrutturazione (resta problema dimensione > 32 kB)
(correzioni, riordinamento, aggiunte priorità delle espansioni)
(ristrutturazione (resta problema dimensione > 32 kB))
Riga 1: Riga 1:
{{Versioni_compatibili}}
{{Versioni_compatibili}}
==Introduzione==
=Introduzione=
Questa non è una guida completa, per la vastità dell'argomento, ma cercherà di far luce sui comportamenti più distintivi di Bash, con enfasi particolare sulle espansioni di stringhe.
Questa non è una guida completa, per la vastità dell'argomento, ma cercherà di far luce sui comportamenti più distintivi di Bash, con enfasi particolare sulle espansioni di stringhe.


Per l'uso interattivo si rimanda a [[Bash tips]].
Per l'uso interattivo si rimanda a [[Bash tips]].


== Variabili (stringhe) ==
= Variabili (stringhe) =
In Bash ogni variabile di default è trattata come una stringa e, benché Bash supporti anche interi e array (indicizzati o associativi), questa sezione si limita al solo tipo base.
In Bash ogni variabile di default è trattata come una stringa e, benché Bash supporti anche interi e array (indicizzati o associativi), questa sezione si limita al solo tipo base.


=== Nomi di variabili ===
==Nomi di variabili==
Un nome di variabile ammette soltanto caratteri alfabetici (maiuscoli e minuscoli), l'underscore ('_') e numeri (non in prima posizione). E il suo contenuto si accede con <code>${nome}</code> oppure con la forma abbreviata <code>$nome</code>.
Un nome di variabile ammette soltanto caratteri alfabetici (maiuscoli e minuscoli), l'underscore ('_') e numeri (non in prima posizione). E il suo contenuto si accede con <code>${nome}</code> oppure con la forma abbreviata <code>$nome</code>.


La forma abbreviata assume che il nome della variabile sia composto da tutti i caratteri validi incontrati. Per esempio la concatenazione <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> (con underscore finale) sarebbe un nome valido.
La forma abbreviata assume che il nome della variabile sia composto da tutti i caratteri validi incontrati. Per esempio la concatenazione <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> (con underscore finale) sarebbe un nome valido.


=== Assegnazioni ===
==Assegnazioni==
Non si deve usare il <code>'''$'''</code> davanti alla variabile a cui assegnare:
Non si deve usare il <code>'''$'''</code> davanti alla variabile a cui assegnare:
<pre>
<pre>
Riga 27: Riga 27:
</pre>
</pre>


=== Espansione ===
==Espansione==
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 (e tabulazioni e "a capo") contenuti, e perfino in "niente" se è vuota. "Niente" proprio come se non presente nel codice.
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 (e tabulazioni e "a capo") contenuti, e perfino in "niente" se è vuota. "Niente" proprio come se non presente nel codice.


Riga 56: Riga 56:
Si noti che usando <code>"$ARGUMENTS"</code> (quotata) per una variabile contenente la stringa vuota, il comando leggerebbe lo stesso un argomento e potrebbe fallire.
Si noti che usando <code>"$ARGUMENTS"</code> (quotata) per una variabile contenente la stringa vuota, il comando leggerebbe lo stesso un argomento e potrebbe fallire.


===Variabili speciali===
==Variabili speciali==
; <code>$?</code> : contiene il valore di uscita dell'ultimo comando o funzione (0 solo in caso di successo);
; <code>$?</code> : contiene il valore di uscita dell'ultimo comando o funzione (0 solo in caso di successo);


Riga 89: Riga 89:
</pre>
</pre>


==Caratteri di escape, apici e virgolette==
=Caratteri di escape, apici e virgolette=
Alcuni caratteri hanno un valore speciale per la shell, per consentire le espansioni o determinati costrutti. Di conseguenza se si intende scrivere il carattere per il suo valore letterale, è necessario comunicarlo alla shell facendolo precedere da un carattere di escape '<code>\</code>' oppure racchiudendolo tra apici o virgolette.
Alcuni caratteri hanno un valore speciale per la shell, per consentire le espansioni o determinati costrutti. Di conseguenza se si intende scrivere il carattere per il suo valore letterale, è necessario comunicarlo alla shell facendolo precedere da un carattere di escape '<code>\</code>' oppure racchiudendolo tra apici o virgolette.


Riga 122: Riga 122:
</pre>
</pre>


===Espansione dei caratteri di escape===
==Espansione dei caratteri di escape==
Sintassi: <code>$'stringa'</code>
Sintassi: <code>$'stringa'</code>


Riga 133: Riga 133:
* ecc...
* ecc...


===Racchiudere tra apici===
==Racchiudere tra apici==
Con gli apici (apostrofi) si riducono i caratteri speciali a uno soltanto, lo stesso apice, rappresentando la stringa per il suo solo valore letterale e impedendo tutte le espansioni:
Con gli apici (apostrofi) si riducono i caratteri speciali a uno soltanto, lo stesso apice, rappresentando la stringa per il suo solo valore letterale e impedendo tutte le espansioni:
<pre>echo '$PATH "" \ `ls ..` \$HOME ~ * .[a-z]*'  # stampa la stringa tra apici, letteralmente</pre>
<pre>echo '$PATH "" \ `ls ..` \$HOME ~ * .[a-z]*'  # stampa la stringa tra apici, letteralmente</pre>
Riga 140: Riga 140:
<pre>echo 'L'\''albero di... ' # stampa "L'albero di..." (l'accento non può essere racchiuso tra apici)</pre>
<pre>echo 'L'\''albero di... ' # stampa "L'albero di..." (l'accento non può essere racchiuso tra apici)</pre>


===Quotare (tra virgolette)===
==Quotare (tra virgolette)==
Racchiudere tra virgolette ogni stringa è raccomandabile, anche se non sempre necessario, così da ridurre il numero di caratteri speciali a cui pensare, permettendo allo stesso tempo l'espansione sicura delle variabili e dei comandi. I soli caratteri speciali rimasti sono <code>$</code>, <code>`</code> (ma non l'apice), <code>"</code> e <code>\</code>, che devono essere preceduti dal carattere di escape <code>\</code>. Le sole espansioni permesse all'interno di una stringa quotata sono quelle attivate da <code>$</code>, ossia di variabile/parametro, di comando e aritmetiche.
Racchiudere tra virgolette ogni stringa è raccomandabile, anche se non sempre necessario, così da ridurre il numero di caratteri speciali a cui pensare, permettendo allo stesso tempo l'espansione sicura delle variabili e dei comandi. I soli caratteri speciali rimasti sono <code>$</code>, <code>`</code> (ma non l'apice), <code>"</code> e <code>\</code>, che devono essere preceduti dal carattere di escape <code>\</code>. Le sole espansioni permesse all'interno di una stringa quotata sono quelle attivate da <code>$</code>, ossia di variabile/parametro, di comando e aritmetiche.


Riga 154: Riga 154:
</pre>
</pre>


Le espansione attivate da <code>$</code> avvengono con la stessa priorità, e in una stringa quotata sono le uniche permesse, quindi il risultato di un'espansione non può essere espanso una seconda volta all'interno di una stringa quotata.
=Espansioni in stringhe quotate=
Le espansione attivate da <code>$</code> avvengono con la stessa priorità, e in una stringa quotata sono le uniche permesse, quindi il risultato di un'espansione non può essere espanso una seconda volta all'interno di una stringa quotata. Sono le espansioni di variabile, già vista, e quelle di parametro, di comando e aritmetica (intera).


==Espansione di parametro (stringa)==
==Espansione di parametro (stringa)==
È una forma modificata dell'espansione di variabile, che permette di operare sulla stringa contenuta con un modificatore.
È una forma modificata dell'espansione di variabile, che permette di operare sulla stringa contenuta con un modificatore.


L'espansione di parametro è utilizzabile ogni volta che lo è quella di variabile, con un'unica differenza: l'espansione di variabile ha priorità maggiore, il che permette di inserire una stringa ottenuta dall'espansione di una variabile in un'espansione di parametro, mentre non è possibile annidare più espansioni di parametro.
L'espansione di parametro è utilizzabile ogni volta che lo è quella di variabile, con un'unica differenza: l'espansione di variabile può essere contenuta in un'espansione di parametro, mentre non è possibile annidare più espansioni di parametro.


Modificatori:
Modificatori:
Riga 317: Riga 318:
echo "Area triangolo: $(($area / 2))" # Stampa 22 (RICORDA: solo interi)
echo "Area triangolo: $(($area / 2))" # Stampa 22 (RICORDA: solo interi)
</pre>
</pre>
=Espansioni non quotabili=
Le seguenti espansioni avvengono unicamente in stringhe non quotate, almeno limitatamente ai caratteri speciali che le attivano. Con l'eccezione dell'espansione di tilda, l'unica che si espande sempre a una singola stringa, le espansioni non quotabili non sono utilizzabili direttamente in un'assegnazione.
Le loro priorità sono tutte diverse: l'espansione di parentesi è quella maggiore, seguita dalla tilda, da tutte le espansioni quotabili e infine dall'espansione di percorso.


==Espansione di tilda==
==Espansione di tilda==
Riga 324: Riga 330:


Si distingue dall'espansione di percorso perché:
Si distingue dall'espansione di percorso perché:
* si espande sempre a una singola stringa;
* può essere espansa in un'assegnazione, se non è quotata;
* può essere espansa in un'assegnazione, se non è quotata;
* ha priorità maggiore dell'espansione di parametro/variabile; per cui, se assegnata quotata a una variabile, non sarà espansa quando si accede alla variabile.
* ha priorità maggiore delle espansioni quotabili; per cui, se assegnata quotata a una variabile, non sarà espansa quando si accede alla variabile.


Esempi:
Esempi:
Riga 443: Riga 450:
for file in ./*.odt ./*.abw ./*.txt ./*.rtf ./*.doc; do
for file in ./*.odt ./*.abw ./*.txt ./*.rtf ./*.doc; do
</pre>
</pre>
=Istruzioni composte=
Rientrano in questa sezione tutte le istruzioni composte da una o più istruzioni più semplici.


==Redirezione==
==Redirezione==
Riga 556: Riga 566:
</pre>
</pre>


== Debug integrato ==
= Debug integrato =
'''Bash''', proprio come '''dash''', ha delle opzioni che ne consentono il debug.
'''Bash''', proprio come '''dash''', ha delle opzioni che ne consentono il debug.


Riga 568: Riga 578:
* <code>-e</code> interrompe lo script in caso di errore (se il comando non è controllato da un <code>if</code>, <code>while</code> o dalla concatenazione con <code>||</code>).
* <code>-e</code> interrompe lo script in caso di errore (se il comando non è controllato da un <code>if</code>, <code>while</code> o dalla concatenazione con <code>||</code>).


==Link==
=Link=


* [http://www.gnu.org/software/bash/manual/bash.html Bash Referece Manual]: manuale ufficiale
* [http://www.gnu.org/software/bash/manual/bash.html Bash Referece Manual]: manuale ufficiale
Riga 577: Riga 587:
|Verificata_da=
|Verificata_da=
:[[Utente:S3v|S3v]] (in Bash tips)
:[[Utente:S3v|S3v]] (in Bash tips)
:[[Utente:HAL 9000|HAL 9000]] 12:05, 12 lug 2014 (CEST)
:[[Utente:HAL 9000|HAL 9000]] 13:22, 12 lug 2014 (CEST)
|Estesa_da=
|Estesa_da=
:[[Utente:S3v|S3v]] (in Bash tips)
:[[Utente:S3v|S3v]] (in Bash tips)
3 581

contributi