Dimensione: 9788
Commento: Aggiunta cicli enumerativi
|
Dimensione: 10400
Commento: Aggiunta descrizione variabili
|
Le cancellazioni sono segnalate in questo modo. | Le aggiunte sono segnalate in questo modo. |
Linea 20: | Linea 20: |
== Variabili speciali == | == Variabili == Le variabili in ''bash scripting'' non hanno bisogno di inizializzazione, l'assegnazione avviene utilizzando la sintassi: {{{ VAR=valore }}} è molto importante che il valore sia scritto subito dopo l'''=''senza nessuno spazio. Il riferimento a tutte le variabili si fanno con anteponendo il carattere ''$'' al nome della variabile: {{{ VAR=world echo hello $VAR! }}} === Variabili speciali === *'''$N''' dove N è un numero intero, corrisponde all'argomento N-simo passato da terminale al programma ($0 è il nome del programma) *'''$*''' stringa che contiene tutti gli argomenti passati da terminale al programma *'''$#''' contiene il numero di argomenti passati da terminale al programma ($0 escluso) * '''$@''' Contiene la lista dei paramentri passati allo script corrente. Ogni parametro viene opportunamente quotato e questo permette l'utilizzo di questa variabile nei cicli for per processare (ad esempio) una lista di nomi di file che possono contenere anche spazi. L'uso di questa variabile è quindi in genere consigliato rispetto a $* che ha la stessa funzione ma non quota i vari parametri. |
Linea 24: | Linea 43: |
* '''$@''' Contiene la lista dei paramentri passati allo script corrente. Ogni parametro viene opportunamente quotato e questo permette l'utilizzo di questa variabile nei cicli for per processare (ad esempio) una lista di nomi di file che possono contenere anche spazi. L'uso di questa variabile è quindi in genere consigliato rispetto a $* che ha la stessa funzione ma non quota i vari parametri. | *'''$$''' contiene il PID del processo in esecuzione |
Linea 26: | Linea 45: |
Esempio: {{{ FILES=$@ |
*'''$!''' contiene il PID dell'ultimo job in background |
Linea 30: | Linea 47: |
for file in $FILES; do # Fare quello che si vuole con $file echo $file # ... done $$ PID del processo corrente. $! PID dell'ultimo job in background }}} |
IndiceBRTableOfContents(2) |
Introduzione
Bash (acronimo per bourne again shell) è una shell del progetto GNU usata nei sistemi operativi Unix e specialmente in Gnu/Linux, si tratta di un interprete di comandi che permette all'utente di comunicare col sistema operativo attraverso una serie di funzioni predefinite, o di eseguire programmi.
Tecnicamente bash è un clone evoluto della shell standard di Unix (/bin/sh) chiamata anche Bourne Shell dal nome del suo autore originario Stephen Bourne e per questo il nome bash deriva dal gioco di parole (definito pessimo addirittura da [http://it.wikipedia.org/wiki/Linus_Torvalds Linus Torvalds]) Bourne again shell che letteralmente significa un'altra shell Bourne, ma dove Bourne again può essere interpretato come rinata creando la definizione finale shell rinata.
In pratica bash può essere considerata come un processore di macro. Essa è infatti in grado di eseguire i comandi che le vengono passati o di interpretare un semplice linguaggio di programmazione che permette di combinare questi comandi tra di loro per svolgere compiti più complessi. Qualora dovesse presentarsi la necessità la shell mette a disposizione la possibilità di raccogliere in file delle serie di comandi creando così script eseguibili contenenti variabili, funzioni e controlli di flusso come nei più comuni linguaggi di programmazione.
Una delle altre maggiori funzionalità di bash è quella della redirezione dell'input e dell'output grazie al quale è possibile eseguire più programmi in cascata passando come input dell'uno l'output dell'altro.
GNU Bash è la shell *nix probabilmente più ricca di funzionalità sia per l'uso interattivo che per lo scripting. Spesso però molte funzioni sono poco note.
Questa pagina ha lo scopo di raccogliere il più ampio numero di "trucchi" più o meno noti riguardanti Bash, senza avere peraltro la pretesa di coprire tutte le funzionalità.
Scripting
Variabili
Le variabili in bash scripting non hanno bisogno di inizializzazione, l'assegnazione avviene utilizzando la sintassi:
VAR=valore
è molto importante che il valore sia scritto subito dopo l=senza nessuno spazio. Il riferimento a tutte le variabili si fanno con anteponendo il carattere $ al nome della variabile:
Nelle shell *nix, storicamente, la manipolazione delle stringhe viene fatto attraverso programmi esterni alla shell come Se si usa In elimina " I modificatori sono molti, ma possono essere facilmente ricordati se si imparano i tre fondamentali: Questi operatori sono minimali, questo vuol dire che se si usano le espressioni regolari per indicare la sottostringa (da eliminare o sostituire) verrà individuata in caso di ambiguità la sottostringa più piccola (o solo la prima nel caso della sostituzione). Per ottenere gli operatori massimali basta raddoppiare il simbolo: Gli operatori massimali cercano di individuare la sottostringa più grande che corrisponde all'espressione regolare (nel caso del modificatore Per una spiegazione dettagliata di tutti i modificatori e anche di altri modi di manipolare le stringhe in
Quando in uno script ci si deve riferire al nome dello script stesso è usuale utilizzare il comando (esterno a bash) basename. Tuttavia, tramite i modificatori del paragrafo precedente, Bash stessa è in grado di fornire questa funzionalità. Basta usare l'espressione ${0##*/}. Esempio:
Rinomina tutti i file *.txt della directory corrente in *.log:
Le operazioni condizionali in bash possono essere eseguite in due modi, tramite il blocco if..then..else (simile al suo omonimo in c) o tramite il blocco case..in (simile allo switch).
Tutto il lavoro di questo blocco è svolto dal programma bash ci sono molte espressioni possibili le più comuni sono: Questo è un esempio d'uso del ciclo if: Come potete notare inserire tra parentesi quadre l'espressione da testare è equivalente a scrivere: Attenzione: l'if bash è molto rigoroso dal punto di vista sintattico, dopo l'espressione da valutare dovete andare a capo e scrivere la parola then, notereta anche che non c'è bisogno di parentesi graffe, infatti il blocco viene terminato con la parola chiave fi.
L'uso del blocco viene valutata $a ed in base al valore contenuto vengono eseguite le operazioni associate.
Al contrario di altri linguaggi, proprio per l'utilizzo che si fà del Bash Scripting, i cicli sono del tipo enumerativo, cioè eseguono le operazioni per tutti gli elementi presenti un una lista indicata, il più importante è sicuramente il ciclo La sua sintassi è: Il parametro dopo il ciclo stamperà sullo standard output questo ciclo stamperà una lista di file, cioè il ciclo eseguirà per ogni singola parola dell'output di [http://www.gnu.org/software/bash/manual/bash.html Manuale ufficiale di Bash] [http://www.tldp.org/LDP/abs/html/ La bibbia del bash scripting] VAR=world
echo hello $VAR!
Variabili speciali
$N dove N è un numero intero, corrisponde all'argomento N-simo passato da terminale al programma ($0 è il nome del programma) Manipolazione delle stringhe
VAR="stringa-di-esempio"
echo ${VAR#stringa-}
#: sottrae dall'inizio della stringa (minimale)
##: sottrae dall'inizio della stringa (massimale) Esempio: Manipolazione delle stringhe
VAR="questa.sarebbe.una.stringa.di.esempio"
# Risultato:
echo ${VAR#*.} # --> sarebbe.una.stringa.di.esempio
echo ${VAR##*.} # --> esempio
echo ${VAR%.*} # --> questa.sarebbe.una.stringa.di
echo ${VAR%%.*} # --> questa
echo ${VAR/st/ST} # --> queSTa.sarebbe.una.stringa.di.esempio
echo ${VAR//st/ST} # --> queSTa.sarebbe.una.STringa.di.esempio
Alternativa a basename
usage () {
echo "usage: ${0##*/} "
exit 1
}
Esempio: Cambiare l'estensione ai file
for f in *.txt; do mv "$f" "${f/%txt/log}"; done
Condizioni
If..Then..Else
test [espr]
-f nomefile: ritorna vero se il file esiste if [ -f prova.txt ]
then
echo Il file esiste!
else
echo Il file non esiste!
fi
test -f prova.txt
Case..In
case $a in
1) echo sono un 1;;
2) echo sono un 2;;
3) echo sono un 3;;
*) echo Non sono ne un 1 ne un 2 ne un 3;;
esac
Cicli Enumerativi
For..Do
for [VAR] [in [LIST]]
do
[COMANDI]
done
for i in 1 2 3 4 5
do
echo sono $i
done
for i in `ls`
do
echo Sono il file $i
done
Ulteriori risorse