3 581
contributi
(aggiunti esempi e casi poco noti, più riformulazione/taglio delle frasi) |
|||
Riga 111: | Riga 111: | ||
pid=$! # ottengo il PID del comando | pid=$! # ottengo il PID del comando | ||
... # eseguo altre operazioni | ... # eseguo altre operazioni | ||
wait $pid # | wait $pid # attendo la terminazione del comando | ||
status=$? # catturo il suo exit status | |||
</pre> | </pre> | ||
Riga 189: | Riga 190: | ||
Il carattere di escape <code>\</code> prima di un "a capo", anche se quotato (tra virgolette), ha un significato speciale che consente di scrivere un comando su più righe, trattando ogni riga preceduta da <code>\</code> come la continuazione del comando precedente: | Il carattere di escape <code>\</code> prima di un "a capo", anche se quotato (tra virgolette), ha un significato speciale che consente di scrivere un comando su più righe, trattando ogni riga preceduta da <code>\</code> come la continuazione del comando precedente: | ||
<pre> | <pre> | ||
# stampa tutto su una riga | # stampa tutto su una riga | ||
echo "testo su \ | echo "testo su \ | ||
più \ | più \ | ||
righe | righe" | ||
# stampa su più righe | # stampa su più righe | ||
echo "testo su | echo "testo su | ||
più | più | ||
righe | righe" | ||
</pre> | </pre> | ||
Riga 332: | Riga 329: | ||
==Espansione di parentesi (graffa)== | ==Espansione di parentesi (graffa)== | ||
Se i caratteri <code>{</code> e <code>}</code> non sono quotati, e non sono preceduti dal carattere di escape <code>\</code>, | Se i caratteri <code>{</code> e <code>}</code> non sono quotati, e non sono preceduti dal carattere di escape <code>\</code>, possono essere espansi con due diverse sintassi. | ||
===Con indici di intervallo=== | |||
Sintassi: <code>prefisso{x..y[..z]}suffisso</code> | |||
L'espansione avviene iterativamente per tutte le stringhe a partire da "prefisso'''x'''suffisso" fino a "prefisso'''y'''suffisso", con incrementi di 1 (o '''z''' se specificato). Le stringhe prefisso e suffisso possono essere omesse, e anche essere variabili (anche quotate, purché le graffe non lo siano), mentre x e y (e z, se presente) devono essere determinati valori: | |||
* <code>{x..y}</code> dove x e y sono due interi (non possono essere variabili); | * <code>{x..y}</code> dove x e y sono due interi (non possono essere variabili); | ||
* <code>{x..y..z}</code> dove x, y e z sono tre interi (non possono essere variabili); | * <code>{x..y..z}</code> dove x, y e z sono tre interi (non possono essere variabili); | ||
Riga 349: | Riga 346: | ||
# crea altri dieci file temporanei (.0, .1, .., .9) con lo stesso nome | # crea altri dieci file temporanei (.0, .1, .., .9) con lo stesso nome | ||
touch -- "$tmp_file".{0..9} | touch -- "$tmp_file".{0..9} | ||
</pre> | </pre> | ||
===Con lista di stringhe=== | ===Con lista di stringhe=== | ||
<code>prefisso{stringa1,stringa2,...}suffisso</code> | Sintassi: <code>prefisso{stringa1,stringa2,...}suffisso</code> | ||
L'espansione avviene per tutte le stringhe nella lista, racchiudendole tra il prefisso e il suffisso dati, se presenti. Il prefisso, il suffisso e tutte le stringhe possono essere variabili, anche quotate, purché non siano quotate le graffe e le virgole interne. | |||
Questa espansione è effettuata prima di tutte le altre, e il risultato dell'espansione se non quotato può quindi subire ulteriori espansioni. Per esempio per effettuare un'operazione sui file nella cartella corrente che hanno una data estensione, si può scrivere: | Questa espansione è effettuata prima di tutte le altre, e il risultato dell'espansione se non quotato può quindi subire ulteriori espansioni. Per esempio per effettuare un'operazione sui file nella cartella corrente che hanno una data estensione, si può scrivere: | ||
Riga 367: | Riga 361: | ||
done | done | ||
</pre> | </pre> | ||
e la prima riga è equivalente a: | |||
<pre> | <pre> | ||
for file in ./*.odt ./*.abw ./*.txt ./*.rtf ./*.doc; do | for file in ./*.odt ./*.abw ./*.txt ./*.rtf ./*.doc; do | ||
</pre> | </pre> | ||
Riga 406: | Riga 396: | ||
* [http://www.tldp.org/LDP/abs/html/special-chars.html Advanced Bash-Scripting Guide: Special Characters] | * [http://www.tldp.org/LDP/abs/html/special-chars.html Advanced Bash-Scripting Guide: Special Characters] | ||
Dirige output di comando su file: | Dirige output di comando su file: | ||
Riga 422: | Riga 411: | ||
Cancella contenuto di un file: | Cancella contenuto di un file: | ||
$ :> xterm.txt | $ :> xterm.txt | ||
===Catturare l'exit status=== | |||
L'exit status è il valore di uscita di un comando. È tipicamente di zero in caso di successo, e un valore maggiore (fino a 255) in presenza di errori. | |||
Per catturare l'exit status di un comando appena eseguito è sufficiente espandere la variabile speciale <code>$?</code>, come già visto. Tuttavia in caso di fallimento del comando, il controllo effettuato via <code>$?</code> avverrebbe soltanto '''dopo''' un blocco con errore (si veda la parte sul debug). | |||
Per evitare che un blocco abbia un exit status diverso da zero, si possono usare le concatenazioni (oppure un <code>if</code>): | |||
<pre> | |||
comando && | |||
status=0 || # se corretto | |||
status=$? # se sbagliato | |||
</pre> | |||
I comandi precedenti costituiscono un unico blocco, sempre corretto, mentre invece: | |||
<pre> | |||
comando # questo comando è anche un blocco | |||
status=$? | |||
comando; status=$? # sono sempre due blocchi distinti</pre> | |||
===Output dei comandi e carattere ASCII n. 0=== | ===Output dei comandi e carattere ASCII n. 0=== | ||
Riga 436: | Riga 444: | ||
L'utilità di questo carattere si deve in particolare al fatto che nemmeno i file possono averlo nel proprio nome, mentre invece permettono caratteri jolly (*, ?, ...) come abbiamo già visto con le espansioni di percorso, e potrebbero contenere perfino il carattere "a capo". | L'utilità di questo carattere si deve in particolare al fatto che nemmeno i file possono averlo nel proprio nome, mentre invece permettono caratteri jolly (*, ?, ...) come abbiamo già visto con le espansioni di percorso, e potrebbero contenere perfino il carattere "a capo". | ||
L'espansione di percorso funziona normalmente, anche in presenza di "a capo", ma potrebbero sorgere problemi sfruttando l'espansione di comando. Per esempio con il comando esterno <code>find</code>, utilizzato per effettuare ricerche in modo ricorsivo, e che di default restituisce tutti i file trovati che soddisfano determinate condizioni stampandoli uno per riga, assumendo implicitamente che non contengano il carattere "a capo". | |||
Uno script a titolo esemplificativo: | Uno script a titolo esemplificativo: | ||
Riga 464: | Riga 474: | ||
<pre> | <pre> | ||
find /percorso -opzione1 ... -opzioneN -print0 | # trova file che soddisfano le condizioni date | find /percorso -opzione1 ... -opzioneN -print0 | # trova file che soddisfano le condizioni date | ||
xargs -0 comando [ argomenti ... ] # passa | xargs -0 comando [ argomenti ... ] # li passa come argomenti a un comando esterno | ||
</pre> | </pre> | ||
Si leggano i rispettivi manuali per maggiori informazioni | Si leggano i rispettivi manuali per maggiori informazioni. <code>find</code> ha inoltre la possibilità di eseguire altri comandi esterni sui file trovati direttamente con le opzioni -exec ed -execdir, ma la sintassi è più complessa e non supporta più di un processo per volta, come invece <code>xargs</code>. | ||
== Debug integrato == | == Debug integrato == | ||
Riga 472: | Riga 482: | ||
'''Bash''', proprio come '''dash''', ha delle opzioni che ne consentono il debug. | '''Bash''', proprio come '''dash''', 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: | |||
$ bash -n script.sh | $ bash -n script.sh | ||
Altre opzioni utili, che possono essere impiegate anche congiuntamente durante l'esecuzione: | |||
* <code>-x</code> | * <code>-x</code> stampa ogni comando prima di eseguirlo; | ||
* <code>-v</code> | * <code>-v</code> stampa l'intero blocco di codice che è stato letto (solo la prima volta); | ||
* <code>-u</code> interrompe l'esecuzione dello script se si accede a una variabile che non è mai stata assegnata | * <code>-u</code> interrompe l'esecuzione dello script se si accede a una variabile che non è mai stata assegnata; | ||
* <code>-e</code> interrompe lo script in caso un | * <code>-e</code> interrompe lo script in caso un blocco ritorni un errore (se il valore di ritorno di un comando non è controllato da un <code>if</code>, <code>while</code>, <code>until</code> o dalla concatenazione di comandi con <code>||</code>). | ||
Le opzioni possono essere anche accorpate: | Le opzioni possono essere anche accorpate: | ||
$ bash - | $ bash -euvx script.sh | ||
==Link== | ==Link== | ||
Riga 495: | Riga 503: | ||
|Verificata_da= | |Verificata_da= | ||
:[[Utente:S3v|S3v]] (versione in Bash tips) | :[[Utente:S3v|S3v]] (versione in Bash tips) | ||
:[[Utente:HAL 9000|HAL 9000]] | :[[Utente:HAL 9000|HAL 9000]] 11:11, 5 lug 2014 (CEST) | ||
|Estesa_da= | |Estesa_da= | ||
:[[Utente:S3v|S3v]] (versione in Bash tips) | :[[Utente:S3v|S3v]] (versione in Bash tips) |
contributi