Bash scripting - comandi essenziali: differenze tra le versioni

aggiunti esempi e altre opzioni
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" -gt 0 ] 2> /dev/null  # non stampa errori se $var non è un intero
# 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:
 
E se si è interessati al solo ramo ''else'', basta utilizzare <code>!</code> prima del comando:
<pre>
<pre>
if ! comando; then
if ! comando; then
3 581

contributi