1. Seminario: Bash Programming
Seminario: Bash Programming
Sebastiano Merlino
Universit` degli Studi di Catania - Facolt` di Ingegneria
a a
17 Maggio 2010
1 / 17
2. Seminario: Bash Programming
Scripting
Scripting
In generale
Un linguaggio di scripting ` un linguaggio di programmazione
e
interpretato destinato a compiti di automazione di sistema, piccole
applicazioni o compiti lightweight.
Generalmente si tratta di semplici programmi atti ad interagire con
sistemi pi` complessi.
u
I primi linguaggi di scripting nacquero dall’esigenza di automatizzare
operazioni ripetitive come l’esecuzione di particolari programmi; essi
trovarono, successivamente, spazio in vari altri ambiti ed attualmente si
trovano molto diffusi anche nello sviluppo per il web.
Bash Scripting
Con tale termine ci si riferisce a quello che ` un linguaggio solitamente
e
usato per l’automazione di processi ripetitivi sui sistemi operativi
Unix-like.
2 / 17
3. Seminario: Bash Programming
Esempi semplici
Esempi semplici
Hello World
#!/bin/bash
echo Hello World
Questo script ha solo due righe.
La prima indica al sistema quale software usare per avviare lo script.
La seconda ` l’azione eseguita dallo script che stamper` a video la scritta
e a
Hello World.
Fornendo diritti di esecuzione allo script esso potr` essere eseguito
a
tramite il comando ./nome script
Script di backup
#!/bin/bash
tar -cZf /var/my-backup.tgz /home/me/
Questo script serve a dimostrare come ogni comando possa essere
eseguito su shell. In questo caso realizziamo facilmente un backup della
home tramite la sua compressione all’interno di un file.
3 / 17
4. Seminario: Bash Programming
Elementi del Linguaggio
Variabili
Le Variabili
Come in qualunque altro linguaggio di programmazione, possiamo usare
le variabili come contenitori pratici per i nostri dati. In questo particolare
linguaggio, non esistono tipi per le variabili e non vi ` necessit` di
e a
dichiararle prima di utilizzarle ma basta solo assegnarne il riferimento.
Hello World - migliorato
#!/bin/bash
STR=Hello World
echo STR
Script di backup - migliorato
#!/bin/bash
OF=/var/my-backup-$(date +%Y%m%d).tgz
tar -cZf $OF /home/me/
In questo modo il nostro backup sara’ facilmente datato. Notate che il
comando date viene eseguito e l’output ci viene ritornato.
4 / 17
5. Seminario: Bash Programming
Elementi del Linguaggio
Variabili
Altre Variabili
Variabili Built-in
Sono variabili predefinite per ogni script e permettono di compiere
svariate azioni tramite il nostro script.
$0: Nome dello script.
$1: Valore del primo parametro (similmente $2, $3, ecc...).
$#: Numero di parametri.
$* e $@: Tutti i parametri.
$-: Opzioni date alla shell.
$?: Exit status dell’ultimo comando.
$$: PID dello script.
Variabili Locali
Esse sono variabili proprie di un certo scope (blocco di codice come una
funzione, un ciclo, ecc...); possono essere create usando il costrutto
local.
5 / 17
6. Seminario: Bash Programming
Elementi del Linguaggio
Caratteri Speciali
Caratteri Speciali
La shell accetta alcuni caratteri speciali o combinazioni di tasti che aiutano
molto nel suo utilizzo quotidiano:
Tasto tab : permette l’auto-completamento del percorso per raggiungere un file.
‘‘ ~ ’’ (ottenibile da <Alt Gr + ` : indica la cartella home.
ı>)
‘‘|’’ : detta anche pipe, connette fra loro due comandi passando in ingresso al
secondo, l’uscita del primo.
‘‘cmd > file’’, ‘‘cmd >> file’’ : salvano i valori stampati dal comando cmd
nel file indicato. Il primo riscrive totalmente il file (cancellando eventuali contenuti
precedenti), il secondo accoda i nuovi contenuti ai vecchi.
‘‘cmd < file’’ : permette al comando cmd di prendere input da file.
‘‘cmd ; cmd’’ : permette di eseguire due comandi uno dopo l’altro.
‘‘()’’ : esegue i comandi contenuti all’interno e fornisce i risultati d’uscita insieme al
termine del secondo.
‘‘&’’ : permette di mantenere il controllo della shell nonostante un programma sia in
esecuzione tramite essa cos` da eseguire pi` programmi contemporaneamente.
ı u
‘‘ ` ’’ (ottenibile da <Alt Gr + ’ >) : detto anche backtick; ci` che ` contenuto fra
o e
due backtick viene eseguito e se ne utilizzeranno i risultati di uscita.
Virgolette doppie ‘‘’’ e virgolette singole ’ ’ : indentificano stringhe.
‘‘ ’’ : backslash; indica alla shell di ignorare il carattere appena successivo.
‘‘ !! ’’ : viene sostituito con l’ultimo comando in history.
6 / 17
7. Seminario: Bash Programming
Elementi del Linguaggio
Operatori
Operatori
Operatori di comparazione Stringhe
s1 = s2: verifica che s1 sia uguale a s2
s1 != s2: verifica che s1 sia diverso da s2
s1 =~ s2: s2 ` un’espressione regolare e confrontata con s1
e
-n s1: verifica che la stringa s1 sia non nulla (almeno un carattere)
-z s1: verifica che la stringa s1 sia nulla
Operatori Aritmetici
Oltre agli operatori aritmetici (+, -, *, /, %) esistono vari operatori relazionali:
-lt (<): Verifica che il numero a sinistra sia minore di quello a destra
-gt (>): Verifica che il numero a sinistra sia maggiore di quello a destra
-le (<=): Verifica che il numero a sinistra sia minore o uguale di quello a destra
-ge (>=): Verifica che il numero a sinistra sia maggiore o uguale di quello a
destra
-eq (==): Verifica che il numero a sinistra sia uguale a quello a destra
-ne (! =): Verifica che il numero a sinistra sia diverso da quello a destra
7 / 17
8. Seminario: Bash Programming
Elementi del Linguaggio
Operatori
Operatori
Operatori su files
-r file: Verifica che il file sia leggibile
-w file: Verifica che il file sia scrivibile
-x file: Verifica che il file sia eseguibile
-f file: Verifica che il file sia ordinario (non un device file o una
cartella)
-s file: Verifica che il file abbia dimensione maggiore di 0
-d file: Verifica che il file sia una directory
-e file: Verifica che il file esista
8 / 17
9. Seminario: Bash Programming
Elementi del Linguaggio
Comandi composti
(list): ci` che qui ` indicato con list, viene eseguito in una subshell e ci viene
o e
restituito solo l’exit status di list.
{list; }: il comando viene eseguito nella shell corrente. Deve essere terminato
da un punto e virgola e le parentesi devono essere isolate mediante spazi.
((expression)): l’epressione ` valutata secondo regole aritmetiche; se il valore
e
restituito dalla valutazione ` diverso da zero, il costrutto restituisce 0, altrimenti
e
viene restituito 1. Equivale a let expression.
[[expression]]: ritorna il valore ottenuto tramite valutazione di un’espressione
condizionale.
( expression ): ritorna il valore di expression; pu` essere usato per forzare la
o
precedenza.
! expression: ` true se expression ` false
e e
expression1 && expression2: restituisce vero se e solo se tutte e due le
espressioni sono vere
expression1 || expression2: restituisce vero se anche una sola delle
espressioni ` vera.
e
Gli operatori && e || godono di corto circuito; nel caso di && la seconda
espressione viene valutata solo se la prima ` vera; invece per || la seconda
e
espressione viene valutata solo se la prima ` falsa.
e
9 / 17
10. Seminario: Bash Programming
Elementi del Linguaggio
Operatori condizionali
Costrutto IF
Assume la forma:
if list; then list; [ elif list; then list; ] ... [ else list; ] fi
`
E il pi` semplice costrutto condizionale ed esegue il blocco di codice
u
dopo l’if solo nel caso in cui l’espressione valutata sia vera.
#!/bin/bash
if [ $1 -lt $2 ]; then
echo Minore
elif [ $1 -gt $2 ]; then
echo Maggiore
else
echo Uguale
fi
Questo script previo passaggio di due numeri come parametri, valuta se
quello a sinistra sia minore, uguale o maggiore di quello a destra.
10 / 17
11. Seminario: Bash Programming
Elementi del Linguaggio
Operatori condizionali
Costrutto CASE
Risulta utile spesso al fine di evitare enormi trafile di if-elif-else. Il tutto
risulta, tramite questo costrutto, molto pi` compresso.
u
case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
Il comando case confronta word con i pattern uno alla volta ed esegue il
blocco corrispondente al primo pattern che fa match con la word.
#!/bin/bash
case $1 in
a) echo a;;
b) echo b;;
c) echo c;;
*) echo default;;
esac
Usando ;& invece che ;; viene eseguito anche il blocco che segue il
simbolo.
Usando ;;& invece che ;; viene valutata anche la condizione che segue il
simbolo e se vera viene eseguito il blocco.
11 / 17
12. Seminario: Bash Programming
Elementi del Linguaggio
Cicli
Costrutto FOR
Sebbene il costrutto si chiami for esso rappresenta quello che tipicamente
in informatica viene detto foreach; esso si occupa di iterare gli elementi di
una sequenza.
#!/bin/bash #!/bin/bash
for i in $( ls ); do for i in ` seq 1 10` do
echo item: $i echo item: $i
done done
Il primo itera su una lista di fle resistuita da ls e ne stampa il nome a
video; il secondo, invece, simula un normale ciclo for (stile C) stampando
i numeri da 1 a 10.
12 / 17
13. Seminario: Bash Programming
Elementi del Linguaggio
Cicli
Costrutti WHILE e UNTIL
Il costrutto while esegue un blocco di codice iterativamente finch´ si
e
mantiene vera la condizione di controllo; il costrutto until invece esegue il
blocco finch´ la condizione di controllo ` falsa.
e e
#!/bin/bash #!/bin/bash
COUNTER=0 COUNTER=20
while [ $COUNTER -lt 10 ]; do until [ $COUNTER -lt 10 ]; do
echo Contatore: $COUNTER echo Contatore: $COUNTER
let COUNTER=COUNTER+1 let COUNTER=COUNTER-1
done done
Il primo mostrer` il valore del contatore per i valori da 0 a 9 ed il secondo
a
per i valori da 20 a 11.
13 / 17
14. Seminario: Bash Programming
Elementi del Linguaggio
Funzioni
Funzioni
Come ogni altro linguaggio di programmazione, anche il linguaggio bash
ha il suo costrutto per la creazione delle funzioni.
Le funzioni risultano esterne rispetto al flusso di esecuzione. Ogni
funzione creata pu` poi essere richiamata all’interno dello script come
o
qualunque altro comando.
#!/bin/bash
function quit {
All’inizio dello script sono dichiarate le funzioni
exit quit, h e f.
}
function h {
Viene eseguita la funzione h che prende un
echo $1 parametro in ingresso stampandolo a video.
}
function f {
Successivamente viene eseguita la funzione f che
local W = parola dichiara al proprio interno la variabile W e la
echo W
}
stampa a video. Infine viene chiamata la funzione
h Hello quit che termina il flusso tramite l’utilizzo della
f
quit
parola chiave exit. L’ultima riga dello script,
echo foo
infatti, non viene eseguita.
14 / 17
15. Seminario: Bash Programming
Elementi del Linguaggio
Select e Menu
Costrutto SELECT
Un tale costrutto permette di creare facilmente dei menu printati su
schermo all’interno dei quali si associa un numero ad un valore che pu`
o
riferire un’azione.
#!/bin/bash
OPTIONS=Hello Quit
select opt in $OPTIONS; do
if [ $opt = Quit ]; then
echo done
exit
elif [ $opt = Hello ]; then
echo Hello World
else
clear
echo bad option
fi
done
Il risultato ` un menu che permette la scelta fra le voci Hello e Quit ed
e
esegue le azioni associate mediante costrutto if.
15 / 17
16. Seminario: Bash Programming
Varie
Varie
Lettura da tastiera
Ci` che un utente scrive su tastiera pu` essere letto mediante il comando
o o
read nomevar. Ritroveremo tutto il contenuto scritto dall’utente fino al
primo ritorno a capo all’interno della variabile nomevar.
Cattura dell’output
Come abbiamo gi` visto gli apici ` permettono di eseguire i comandi
a
che si trovano al loro interno.
Mediante una sintassi del tipo var=` comando ` riusciamo a trovare
all’interno della variabile var l’output del comando fra apici.
16 / 17
17. Seminario: Bash Programming
Andare Oltre
Sei sicuro di voler usare Bash?
Array
Gli array si indicano con la classica notazione [ ]. Quindi
nome array[indice]=valore indicher` che l’elemento dell’array indicato con
a
indice assume il valore specificato. Gli array possono essere sparsi.
Thread
Possono essere lanciati comandi e processi in maniera asincrona tramite la
sintassi coproc NAME command [redirections].
Tool
source: lancia l’esecuzione di un’altro script.
sed e awk: utili per il parsing e il processamento di stringhe.
Altro
Molto altro lo potete trovare negli script associati alle slide che verranno
presentati sul sito.
17 / 17