6 999
contributi
mNessun oggetto della modifica |
S3v (discussione | contributi) mNessun oggetto della modifica |
||
Riga 1: | Riga 1: | ||
{{Bash_scripting}} | {{Bash_scripting}} | ||
__TOC__ | |||
I comandi introdotti in questa sezione sono descritti solo limitatamente alla loro sintassi base, così che il loro impiego nelle sezioni successive possa essere facilmente compreso. | I comandi introdotti in questa sezione sono descritti solo limitatamente alla loro sintassi base, così che il loro impiego nelle sezioni successive possa essere facilmente compreso. | ||
La lettura della sezione può essere tralasciata, se si hanno già nozioni basilari di '''bash''', ma la parte sui comandi di output serve anche a giustificare la scelta di <code>printf</code> in luogo del più noto <code>echo</code> come unico comando di output e a spiegarne brevemente la sintassi, almeno per le invocazioni più comuni. | La lettura della sezione può essere tralasciata, se si hanno già nozioni basilari di '''bash''', ma la parte sui comandi di output serve anche a giustificare la scelta di <code>printf</code> in luogo del più noto <code>echo</code> come unico comando di output e a spiegarne brevemente la sintassi, almeno per le invocazioni più comuni. | ||
==Comandi di output: echo e printf== | == Comandi di output: echo e printf == | ||
Il comando <code>echo</code> è largamente diffuso in Bash per stampare delle stringhe su schermo, perché ha una sintassi più semplice di <code>printf</code> e non risente delle stesse limitazioni della shell sh (''POSIX''), che interpreta ed espande i caratteri di escape (si legga la sezione dedicata) senza che ci sia un modo di stampare letteralmente una stringa (non nota a priori). | Il comando <code>echo</code> è largamente diffuso in Bash per stampare delle stringhe su schermo, perché ha una sintassi più semplice di <code>printf</code> e non risente delle stesse limitazioni della shell sh (''POSIX''), che interpreta ed espande i caratteri di escape (si legga la sezione dedicata) senza che ci sia un modo di stampare letteralmente una stringa (non nota a priori). | ||
Riga 19: | Riga 19: | ||
In questa guida d'ora in poi si farà riferimento soltanto a <code>printf</code>. | In questa guida d'ora in poi si farà riferimento soltanto a <code>printf</code>. | ||
===Uso di printf=== | === Uso di printf === | ||
Sintassi: <code>printf formato [ "stringa" ... ]</code> | Sintassi: <code>printf formato [ "stringa" ... ]</code> | ||
Riga 69: | Riga 69: | ||
</pre> | </pre> | ||
====Stampa di messagi d'errore==== | ==== Stampa di messagi d'errore ==== | ||
Per i messaggi di errore, benché sia possibile stamparli assieme ai messaggi normali (sullo ''standard output''), è conveniente utilizzare lo ''standard error'' che ne permette la gestione separata. Se nessuna redirezione è specificata, saranno comunque stampati a schermo a prescindere dall'uso di ''standard output'', che è implicito, o ''standard error''. | Per i messaggi di errore, benché sia possibile stamparli assieme ai messaggi normali (sullo ''standard output''), è conveniente utilizzare lo ''standard error'' che ne permette la gestione separata. Se nessuna redirezione è specificata, saranno comunque stampati a schermo a prescindere dall'uso di ''standard output'', che è implicito, o ''standard error''. | ||
Riga 79: | Riga 79: | ||
</pre> | </pre> | ||
====Sovrascrivere echo==== | ==== Sovrascrivere echo ==== | ||
Se non si riesce a fare a meno di <code>echo</code> si può sovrascriverlo per gli usi più basilari, così da utilizzare al suo posto <code>printf</code> in modo trasparente, mettendo queste definizioni in cima allo script subito dopo lo ''shebang'': | Se non si riesce a fare a meno di <code>echo</code> si può sovrascriverlo per gli usi più basilari, così da utilizzare al suo posto <code>printf</code> in modo trasparente, mettendo queste definizioni in cima allo script subito dopo lo ''shebang'': | ||
<pre> | <pre> | ||
Riga 111: | Riga 111: | ||
</pre> | </pre> | ||
==Condizioni== | == Condizioni == | ||
Le condizioni nella shell dipendono dal valore di uscita (exit status) di un comando. Si considera successo un exit status corrispondente a 0, ed è equivalente a una condizione vera/soddisfatta, mentre fallimento un exit status con valori diversi da zero, e sono equivalenti a una condizione falsa/non soddisfatta. | Le condizioni nella shell dipendono dal valore di uscita (exit status) di un comando. Si considera successo un exit status corrispondente a 0, ed è equivalente a una condizione vera/soddisfatta, mentre fallimento un exit status con valori diversi da zero, e sono equivalenti a una condizione falsa/non soddisfatta. | ||
Riga 129: | Riga 129: | ||
</pre> | </pre> | ||
===Espressioni booleane=== | === Espressioni booleane === | ||
Le espressioni booleane più basilari, ereditate da ''POSIX'', si possono esprimere con i comandi <code>test</code> e <code>[</code>. L'unica differenza tra i due è che il secondo richiede <code>]</code> come ultimo argomento, ed è preferibile per questioni di leggibilità del codice. D'ora in poi infatti si considera soltanto <code>[ ... ]</code>, e in questa sezione vengono descritte solo le forme più basilari. Per tutte le opzioni supportate si rimanda all'aiuto integrato (<code>help test</code>). | Le espressioni booleane più basilari, ereditate da ''POSIX'', si possono esprimere con i comandi <code>test</code> e <code>[</code>. L'unica differenza tra i due è che il secondo richiede <code>]</code> come ultimo argomento, ed è preferibile per questioni di leggibilità del codice. D'ora in poi infatti si considera soltanto <code>[ ... ]</code>, e in questa sezione vengono descritte solo le forme più basilari. Per tutte le opzioni supportate si rimanda all'aiuto integrato (<code>help test</code>). | ||
Riga 168: | Riga 168: | ||
* <code>[ -x "$var" ]</code>: vero se il file esiste e l'utente corrente ha il permesso di esecuzione (o accesso per le directory). | * <code>[ -x "$var" ]</code>: vero se il file esiste e l'utente corrente ha il permesso di esecuzione (o accesso per le directory). | ||
===Esecuzione condizionata=== | === Esecuzione condizionata === | ||
Per eseguire un blocco di comandi soltanto se una condizione è soddisfatta si utilizza <code>if</code>, solitamente in combinazione con <code>[...]</code>. | Per eseguire un blocco di comandi soltanto se una condizione è soddisfatta si utilizza <code>if</code>, solitamente in combinazione con <code>[...]</code>. | ||
Riga 194: | Riga 194: | ||
</pre> | </pre> | ||
====Controllo degli errori==== | ==== Controllo degli errori ==== | ||
Si ricordi che <code>if</code> accetta un comando qualsiasi come condizione, valutandone l'exit status ed eseguendo il ramo <code>then</code> se ha successo, e quello <code>elif</code>/<code>else</code> immediatamente successivo (se presente) altrimenti. Quindi è un ottimo strumento anche per controllare che un comando venga eseguito senza errori, permettendo anche la terminazione immediata dello script: | Si ricordi che <code>if</code> accetta un comando qualsiasi come condizione, valutandone l'exit status ed eseguendo il ramo <code>then</code> se ha successo, e quello <code>elif</code>/<code>else</code> immediatamente successivo (se presente) altrimenti. Quindi è un ottimo strumento anche per controllare che un comando venga eseguito senza errori, permettendo anche la terminazione immediata dello script: | ||
<pre> | <pre> |
contributi