6 999
contributi
m (→Introduzione) |
S3v (discussione | contributi) mNessun oggetto della modifica |
||
Riga 1: | Riga 1: | ||
{{Bash_scripting}} | {{Bash_scripting}} | ||
__TOC__ | |||
Lo scopo di questa guida, partendo dai concetti più basilari, è di evidenziare i comportamenti più distintivi e facili da sbagliare di '''bash''', con enfasi particolare sulle espansioni di stringhe, estremamente diverse da altri linguaggi di programmazione. Si cercherà anche di presentare le istruzioni in una sintassi il più possibile compatibile con la shell '''sh'''. | Lo scopo di questa guida, partendo dai concetti più basilari, è di evidenziare i comportamenti più distintivi e facili da sbagliare di '''bash''', con enfasi particolare sulle espansioni di stringhe, estremamente diverse da altri linguaggi di programmazione. Si cercherà anche di presentare le istruzioni in una sintassi il più possibile compatibile con la shell '''sh'''. | ||
Riga 11: | Riga 11: | ||
Per l'uso interattivo, per cui questa shell è ottima, si rimanda a [[Bash tips]]; e la lettura di questa guida può aiutare anche nella personalizzazione del proprio ambiente di lavoro, definendo per esempio delle funzioni in <code>~/.bashrc</code>. Si noti che l'espansione dello storico (''history expansion''), lì presentata e che qui manca, è attiva soltanto in modalità interattiva, mediante i caratteri speciali <code>!</code> e <code>^</code>. | Per l'uso interattivo, per cui questa shell è ottima, si rimanda a [[Bash tips]]; e la lettura di questa guida può aiutare anche nella personalizzazione del proprio ambiente di lavoro, definendo per esempio delle funzioni in <code>~/.bashrc</code>. Si noti che l'espansione dello storico (''history expansion''), lì presentata e che qui manca, è attiva soltanto in modalità interattiva, mediante i caratteri speciali <code>!</code> e <code>^</code>. | ||
==Breve storia della shell== | == Breve storia della shell == | ||
GNU '''bash''' (''Bourne-Again SHell'') è una delle shell derivate da '''sh''' (la ''Bourne SHell'', progettata da Stephen Bourne), la prima progettata per lo scripting. Bash è la scelta di default per l'uso interattivo su Debian e molte distribuzioni GNU/Linux, il che la rende una delle più diffuse, e incorpora molte nuove funzionalità rispetto a '''sh''', alcune anche derivanti da altre shell ('''csh''' e '''ksh'''). | GNU '''bash''' (''Bourne-Again SHell'') è una delle shell derivate da '''sh''' (la ''Bourne SHell'', progettata da Stephen Bourne), la prima progettata per lo scripting. Bash è la scelta di default per l'uso interattivo su Debian e molte distribuzioni GNU/Linux, il che la rende una delle più diffuse, e incorpora molte nuove funzionalità rispetto a '''sh''', alcune anche derivanti da altre shell ('''csh''' e '''ksh'''). | ||
Riga 20: | Riga 20: | ||
Per quanto possibile in questa guida, in presenza di sintassi alternative, si tenderà a prediligere quella presente in ''POSIX'' e si segnalerà ogni volta che un'istruzione è presente unicamente in '''bash'''. | Per quanto possibile in questa guida, in presenza di sintassi alternative, si tenderà a prediligere quella presente in ''POSIX'' e si segnalerà ogni volta che un'istruzione è presente unicamente in '''bash'''. | ||
==Come creare uno script== | == Come creare uno script == | ||
Uno script, per poter essere eseguito come un eseguibile qualsiasi, in ambiente Unix e Unix-like deve: | Uno script, per poter essere eseguito come un eseguibile qualsiasi, in ambiente Unix e Unix-like deve: | ||
* avere il bit di esecuzione attivo; | * avere il bit di esecuzione attivo; | ||
Riga 31: | Riga 31: | ||
</pre> | </pre> | ||
È consigliato inoltre di determinare esplicitamente il valore di ritorno (''exit status'') di uno script, facendolo terminare con l'istruzione <code>exit</code> seguita dall'exit status, che è un valore intero compreso tipicamente tra 0 (l'unico valore | È consigliato inoltre di determinare esplicitamente il valore di ritorno (''exit status'') di uno script, facendolo terminare con l'istruzione <code>exit</code> seguita dall'exit status, che è un valore intero compreso tipicamente tra 0 (l'unico valore che indica uno status di uscita dello script senza che siano avvenuti errori) e 255. In assenza di tale istruzione il valore di ritorno dello script sarà determinato dall'exit status dell'ultimo comando eseguito. | ||
Inoltre è bene sapere che l'esecuzione di uno script in '''bash''', così come uno in '''sh''' (''POSIX''), di default non è interrotta in presenza di errori. È importante quindi controllare l'exit status dei comandi eseguiti, se possono fallire, con <code>if</code> oppure con gli operatori logici di | Inoltre è bene sapere che l'esecuzione di uno script in '''bash''', così come uno in '''sh''' (''POSIX''), di default non è interrotta in presenza di errori. È importante quindi controllare l'exit status dei comandi eseguiti, se possono fallire, con <code>if</code> oppure con gli operatori logici di concatenazione <code>&&</code> e <code>||</code>, che saranno introdotti. | ||
Fa eccezione l'istruzione <code>exec</code> che, se seguita da un eseguibile esterno (anche un altro script), fa eseguire al processo corrente il nuovo eseguibile. Le istruzioni successive nello script non verranno eseguite, e il valore di uscita dello script è determinato da quello del nuovo eseguibile. | Fa eccezione l'istruzione <code>exec</code> che, se seguita da un eseguibile esterno (anche un altro script), fa eseguire al processo corrente il nuovo eseguibile. Le istruzioni successive nello script non verranno eseguite, e il valore di uscita dello script è determinato da quello del nuovo eseguibile. | ||
===Commenti=== | === Commenti === | ||
È considerato commento tutto ciò che segue il carattere <code>#</code> fino alla nuova riga, purché <code>#</code> non sia racchiuso tra virgolette, apici o preceduto da <code>\</code>, in tal caso mantiene il suo valore letterale. | È considerato commento tutto ciò che segue il carattere <code>#</code> fino alla nuova riga, purché <code>#</code> non sia racchiuso tra virgolette, apici o preceduto da <code>\</code>, in tal caso mantiene il suo valore letterale. | ||
Riga 44: | Riga 44: | ||
Si noti che lo stessa ''shebang'' introduce una riga di commento, così da poter essere riconosciuta dal sistema grazie al sistema dei ''magic pattern'' e allo stesso tempo essere ignorata dall'interprete. | Si noti che lo stessa ''shebang'' introduce una riga di commento, così da poter essere riconosciuta dal sistema grazie al sistema dei ''magic pattern'' e allo stesso tempo essere ignorata dall'interprete. | ||
===Il primo script=== | === Il primo script === | ||
Esempio di classico programma che si limita a stampare "Hello world!" sullo schermo: | Esempio di classico programma che si limita a stampare "Hello world!" sullo schermo: | ||
<pre> | <pre> | ||
Riga 52: | Riga 52: | ||
</pre> | </pre> | ||
===Rendere eseguibile uno script=== | === Rendere eseguibile uno script === | ||
Una volta scritto lo script, non resta che attivarne il bit di esecuzione. Supponendo si chiami ''script.sh'', da un terminale dare: | Una volta scritto lo script, non resta che attivarne il bit di esecuzione. Supponendo si chiami ''script.sh'', da un terminale dare: | ||
<pre> | <pre> | ||
Riga 63: | Riga 63: | ||
</pre> | </pre> | ||
==Debug integrato== | == Debug integrato == | ||
'''Bash''', proprio come '''dash''' (la cui sintassi è limitata quasi soltanto alla shell POSIX), ha delle opzioni che ne consentono il debug. | '''Bash''', proprio come '''dash''' (la cui sintassi è limitata quasi soltanto alla shell POSIX), ha delle opzioni che ne consentono il [[debug]]. | ||
Invocando uno script con <code>-n</code> è possibile effettuare un primitivo controllo di sintassi. Non vengono controllati comandi inesistenti e nemmeno le espansioni, ma può essere utile per verificare che i blocchi sono stati chiusi correttamente prima di eseguire lo script: | Invocando uno script con <code>-n</code> è possibile effettuare un primitivo controllo di sintassi. Non vengono controllati comandi inesistenti e nemmeno le espansioni, ma può essere utile per verificare che i blocchi sono stati chiusi correttamente prima di eseguire lo script: |
contributi