6 999
contributi
m (aggiunta parte su $IFS) |
S3v (discussione | contributi) mNessun oggetto della modifica |
||
Riga 1: | Riga 1: | ||
{{Bash_scripting}} | {{Bash_scripting}} | ||
__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. | ||
==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. La forma consigliata, salvo necessità particolari, è quella tra virgolette per le stringhe e le concatenazioni di stringhe e variabili, e senza virgolette per una singola variabile: | Non si deve usare il <code>'''$'''</code> davanti alla variabile a cui assegnare. La forma consigliata, salvo necessità particolari, è quella tra virgolette per le stringhe e le concatenazioni di stringhe e variabili, e senza virgolette per una singola variabile: | ||
<pre> | <pre> | ||
Riga 29: | Riga 29: | ||
</pre> | </pre> | ||
===Modificatori=== | === Modificatori === | ||
Sono comandi interni che possono essere applicati soltanto a un nome di variabile (senza '''$''') o a un'assegnazione, e in quest'ultimo caso hanno effetto sulla variabile dopo l'avvenuta assegnazione. | Sono comandi interni che possono essere applicati soltanto a un nome di variabile (senza '''$''') o a un'assegnazione, e in quest'ultimo caso hanno effetto sulla variabile dopo l'avvenuta assegnazione. | ||
; export : specifica che la variabile farà parte delle variabili d'ambiente (''environment'') dei comandi esterni eseguiti dallo script: | ; export : specifica che la variabile farà parte delle variabili d'ambiente (''environment'') dei comandi esterni eseguiti dallo script: | ||
Riga 56: | Riga 56: | ||
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. | ||
===Assegnazione dallo standard input=== | === Assegnazione dallo standard input === | ||
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. | ||
Riga 82: | Riga 82: | ||
</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. | ||
Riga 118: | Riga 118: | ||
Si ricordi che le istruzioni su più righe possono essere scritte sulla stessa, facendo terminare il comando con il carattere speciale <code>;</code> come fatto per esempio con <code>if ... ; then</code>. Per i cicli tuttavia scrivere <code>do</code> su una nuova riga ne migliora la leggibilità. | Si ricordi che le istruzioni su più righe possono essere scritte sulla stessa, facendo terminare il comando con il carattere speciale <code>;</code> come fatto per esempio con <code>if ... ; then</code>. Per i cicli tuttavia scrivere <code>do</code> su una nuova riga ne migliora la leggibilità. | ||
==Espansione di variabile== | == Espansione di variabile == | ||
I caratteri utilizzati per la divisione di una stringa in più stringhe sono quelli contenuti nella variabile <code>$IFS</code> (di default appunto: spazio, tabulazione e "a capo"), ed è consigliabile non modificarla, se non eventualmente prima di <code>read</code>, per non alterare il normale funzionamento di uno script. | I caratteri utilizzati per la divisione di una stringa in più stringhe sono quelli contenuti nella variabile <code>$IFS</code> (di default appunto: spazio, tabulazione e "a capo"), ed è consigliabile non modificarla, se non eventualmente prima di <code>read</code>, per non alterare il normale funzionamento di uno script. | ||
Riga 152: | Riga 152: | ||
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 173: | Riga 173: | ||
</pre> | </pre> | ||
L'istruzione <code>shift</code> può essere usata per rimuovere i parametri più a sinistra (partendo da <code>$1</code>), spostando tutti gli altri (<code>$1</code><-<code>$2</code>, <code>$2</code><-<code>$3</code>, ...), in questo modo si | L'istruzione <code>shift</code> può essere usata per rimuovere i parametri più a sinistra (partendo da <code>$1</code>), spostando tutti gli altri (<code>$1</code><-<code>$2</code>, <code>$2</code><-<code>$3</code>, ...), in questo modo si può accedere, come una lista, solo ai successivi. | ||
Per esempio, codice che crea una lista di file in un percorso scelto: | Per esempio, codice che crea una lista di file in un percorso scelto: |
contributi