3 581
contributi
m (rimosso template autori) |
(aggiunti esempi e altre opzioni) |
||
Riga 67: | Riga 67: | ||
printf %s\\n "Sintassi:" | printf %s\\n "Sintassi:" | ||
printf '\t%s\n' "$0 [ arg ]" | printf '\t%s\n' "$0 [ arg ]" | ||
</pre> | |||
====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''. | |||
Il significato delle redirezioni sarà trattato in seguito in un capitolo apposito della guida. Per ora e per buona parte della guida basti sapere che per stampare messaggi di errore è sufficiente aggiungere '''>&2''' al termine dell'istruzione <code>printf</code>. | |||
Per esempio: | |||
<pre> | |||
printf %s\\n "ERRORE: il file specificato non esiste!" >&2 # standard error | |||
</pre> | </pre> | ||
Riga 99: | Riga 109: | ||
* <code>[ "$var" = "stringa" ]</code>: vero se il contenuto di var è uguale alla stringa; | * <code>[ "$var" = "stringa" ]</code>: vero se il contenuto di var è uguale alla stringa; | ||
* <code>[ "$var" != "stringa" ]</code>: vero se è diverso. | * <code>[ "$var" != "stringa" ]</code>: vero se è diverso. | ||
Su '''bash''' si può usare anche <code>==</code> al posto di <code>=</code>, per chi ha familiarità con la sintassi dei confronti C-like, ma non è ''POSIX''. | |||
Confronti binari tra stringhe contenenti interi (possono essere anche entrambe variabili): | Confronti binari tra stringhe contenenti interi (possono essere anche entrambe variabili): | ||
* <code>[ "$var" -eq valore ]</code>: ('''eq'''ual to) vero se l'intero contenuto nella variabile è uguale al valore dato; | |||
* <code>[ "$var" -ne valore ]</code>: ('''n'''ot '''e'''qual to) vero se l'intero contenuto nella variabile non è uguale al valore dato; | |||
* <code>[ "$var" -gt valore ]</code>: ('''g'''reater '''t'''han) vero se l'intero contenuto nella variabile è maggiore del valore dato; | * <code>[ "$var" -gt valore ]</code>: ('''g'''reater '''t'''han) vero se l'intero contenuto nella variabile è maggiore del valore dato; | ||
* <code>[ "$var" -ge valore ]</code>: ('''g'''reater or '''e'''qual to) vero se l'intero contenuto nella variabile è maggiore o uguale al valore dato; | * <code>[ "$var" -ge valore ]</code>: ('''g'''reater or '''e'''qual to) vero se l'intero contenuto nella variabile è maggiore o uguale al valore dato; | ||
* <code>[ "$var" -lt valore ]</code>: ('''l'''ower '''t'''han) vero se l'intero contenuto nella variabile è inferiore del valore dato. | * <code>[ "$var" -lt valore ]</code>: ('''l'''ower '''t'''han) vero se l'intero contenuto nella variabile è inferiore del valore dato. | ||
* <code>[ "$var" -le valore ]</code>: ('''l'''ower or '''e'''qual to) vero se l'intero contenuto nella variabile è inferiore o uguale al valore dato. | * <code>[ "$var" -le valore ]</code>: ('''l'''ower or '''e'''qual to) vero se l'intero contenuto nella variabile è inferiore o uguale al valore dato. | ||
Se una delle due stringhe non è un intero, anche negativo, il confronto fallisce e può esserci la stampa di un messaggio d'errore sullo standard error. Per evitarlo va aggiunto <code>2> /dev/null</code> (il significato di tale redirezione sarà trattato in seguito). Per esempio: | Se una delle due stringhe non è un intero, anche negativo, il confronto fallisce e può esserci la stampa di un messaggio d'errore sullo standard error. Per evitarlo va aggiunto <code>2> /dev/null</code> (il significato di tale redirezione sarà trattato in seguito). | ||
Per esempio: | |||
<pre> | <pre> | ||
[ "$var" - | # Controlla che la variabile sia un intero non negativo | ||
[ "$var" -ge 0 ] 2> /dev/null # non stampa errori se $var non è un intero | |||
</pre> | </pre> | ||
Riga 113: | Riga 129: | ||
* <code>[ -e "$var" ]</code>: vero se il file (file regolare, directory, link simbolico, fifo, socket, ... ) esiste; | * <code>[ -e "$var" ]</code>: vero se il file (file regolare, directory, link simbolico, fifo, socket, ... ) esiste; | ||
* <code>[ -f "$var" ]</code>: vero se il file esiste ed è un file regolare; | * <code>[ -f "$var" ]</code>: vero se il file esiste ed è un file regolare; | ||
* <code>[ -d "$var" ]</code>: vero se il file esiste ed è una directory. | * <code>[ -d "$var" ]</code>: vero se il file esiste ed è una directory; | ||
* <code>[ -r "$var" ]</code>: vero se il file esiste e l'utente corrente ha il permesso di lettura; | |||
* <code>[ -w "$var" ]</code>: vero se il file esiste e l'utente corrente ha il permesso di scrittura; | |||
* <code>[ -x "$var" ]</code>: vero se il file esiste e l'utente corrente ha il permesso di esecuzione (o attraversamento per le directory). | |||
====Condizioni più avanzate==== | |||
Le espressioni più complesse si possono comporre utilizzando gli operatori logici <code>&&</code> e <code>||</code> per aggregare più istruzioni <code>[...]</code>, e le parentesi <code>{ ... ; }</code> per determinarne la priorità, come si vedrà nella parte sui blocchi di istruzioni. | Le espressioni più complesse si possono comporre utilizzando gli operatori logici <code>&&</code> e <code>||</code> per aggregare più istruzioni <code>[...]</code>, e le parentesi <code>{ ... ; }</code> per determinarne la priorità, come si vedrà nella parte sui blocchi di istruzioni. | ||
Per ora basti sapere che possono essere aggregate con <code>||</code> (''OR'' logico) e <code>&&</code> (''AND'' logico): | |||
<pre> | |||
# Controlla che la variabile sia un intero (positivo o negativo) | |||
[ "$var" -ge 0 ] 2> /dev/null || [ "$var" -lt 0 ] 2> /dev/null | |||
[ "$var" -ne 0 ] 2> /dev/null || [ "$var" -eq 0 ] 2> /dev/null # equivalente | |||
[ "$var" -ne 0 ] 2> /dev/null || [ "$var" = 0 ] # equivalente | |||
# Controlla che il file regolare esista e sia leggibile | |||
[ -f "$var" ] && [ -r "$var" ] | |||
# Controlla che il file regolare esista e sia eseguibile | |||
# (permesso di lettura + esecuzione) | |||
[ -f "$var" ] && [ -r "$var" ] && [ -x "$var" ] | |||
# Controlla che la directory esista e sia possibile listarne il contenuto | |||
# (per sapere se un file esiste nella directory) | |||
[ -d "$var" ] && [ -r "$var" ] | |||
# Controlla che la directory esista e sia possibile accederne il contenuto | |||
# (leggendo o scrivendo i file, se i loro permessi lo consentono) | |||
[ -d "$var" ] && [ -x "$var" ] | |||
# Controlla che la directory esista e sia possibile listarne e accederne il contenuto | |||
[ -d "$var" ] && [ -r "$var" ] && [ -x "$var" ] | |||
# Controlla che la directory esista e sia possibile creare e cancellare i file contenuti, e modificarne i permessi | |||
# (permesso di attraversamento + scrittura) | |||
[ -d "$var" ] && [ -x "$var" ] && [ -w "$var" ] | |||
# Controlla che la directory esista e sia possibile cancellarla, eliminandone ricorsivamente il contenuto | |||
# (permesso di lettura, per listarne il contenuto, + attraversamento + scrittura come il caso precedente) | |||
[ -d "$var" ] && [ -r "$var" ] && [ -x "$var" ] && [ -w "$var" ] | |||
</pre> | |||
===Esecuzione condizionata=== | ===Esecuzione condizionata=== | ||
Riga 149: | Riga 203: | ||
printf %s\\n "Comando riuscito!" | printf %s\\n "Comando riuscito!" | ||
else | else | ||
printf %s\\n "ERRORE: comando fallito!" | printf %s\\n "ERRORE: comando fallito!" >&2 # stampa sullo standard error | ||
# esci con errore (exit status 1) | # esci con errore (exit status 1) | ||
exit 1 | exit 1 | ||
fi | fi | ||
</pre> | </pre> | ||
E se si è interessati al solo ramo ''else'', basta utilizzare <code>!</code> prima del comando: | |||
<pre> | <pre> | ||
if ! comando; then | if ! comando; then |
contributi