Il sistema operativo LINUX Script di Shell File di comandi (script)

Transcript

Il sistema operativo LINUX Script di Shell File di comandi (script)
•Sistemi operativi
Il sistema operativo LINUX
Script di Shell
Giorgio Di Natale <[email protected]>
Stefano Di Carlo <[email protected]>
Bartolomeo Montrucchio <[email protected]>
Politecnico di Torino
Dip. Automatica e Informatica
Sistemi Operativi - Script di Shell
1
File di comandi (script)
• E’ possibile memorizzare in un file una serie di
comandi, eseguibili richiamando il file stesso:
– Esecuzione indiretta:
source <scriptname> <args>
Nota: in tal caso non serve il permesso di esecuzione
– Esecuzione diretta eseguendo lo script
• E’ necessario che lo script abbia il permesso di
esecuzione
• La prima riga del file inizia con #! seguita dal
nome (con il path assoluto) della shell con cui si
vogliono (funziona anche senza) eseguire i comandi
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
2
•1
•Sistemi operativi
Indice
•
•
•
•
•
•
Variabili
Caratteri particolari
Condizioni
if, for, while, case
Istruzioni particolari
Segnali
Sistemi Operativi - Script di Shell
3
Indice
•
•
•
•
•
•
Variabili
Caratteri particolari
Condizioni
if, for, while, case
Istruzioni particolari
Segnali
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
4
•2
•Sistemi operativi
Variabili
• TCSH
– set myVar = ciao
– set myVar = “Una prova”
– set myVar = $otherVar
NOTA: le variabili di
ambiente si settano con
setenv myvar ciao, usare
unset e unsetenv per
cancellare
Sistemi Operativi - Script di Shell
• BASH
– myVar=ciao
– myVar=“Una prova”
– myVar=$otherVar
NOTA: per le variabili di
ambiente usare poi export;
unset per cancellare
ambedue i tipi
5
Variabili predefinite
• Parametri della linea di comando
– $1
primo parametro
– $#
numero di parametri
– $0
nome dello script di shell
– $*
stringa con tutti i parametri
– $?var vale 1 se la variabile var è stata definita
– $#var il numero di elementi in var (per array)
– $?
Exit code dell’ultimo programma eseguito
– $$
PID del processo
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
6
•3
•Sistemi operativi
Variabili vettoriali
• Sono previste variabili vettori:
– definizione enumerando i valori tra parentesi
tonde
– accesso
con la notazione del C (ossia
parentesi quadre); è possibile
specificare degli intervalli
Sistemi Operativi - Script di Shell
7
Variabili vettoriali - Esempio
set v = (a b c)
echo $?v
echo $#v
echo $v[2]
echo $v[1-2]
unset v
echo $#v
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
1
3
b
a b
Undefined variable: v
8
•4
•Sistemi operativi
Indice
•
•
•
•
•
•
Variabili
Caratteri particolari
Condizioni
if, for, while, case
Istruzioni particolari
Segnali
Sistemi Operativi - Script di Shell
9
Caratteri particolari (“)
• ‘’” identifica una stringa. All’interno
vengono espanse le variabili
– myVar = “Ciao”
– echo “Contenuto di myVar: $myVar”
Contenuto di myVar: Ciao
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
10
•5
•Sistemi operativi
Caratteri particolari (‘)
• ‘’
identifica una stringa. All’interno
non vengono espanse le variabili
ATTENZIONE: accento acuto (es. perché)
– myVar = “Ciao”
– echo ‘Contenuto di myVar: $myVar’
Contenuto di myVar: $myVar
Sistemi Operativi - Script di Shell
11
Caratteri particolari (\)
• \
identifica il carattere di escape
– myVar = \$Ciao
– echo “Contenuto di myVar: $myVar”
Contenuto di myVar: $Ciao
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
12
•6
•Sistemi operativi
Caratteri particolari (`)
• `...`
identifica la sostituzione di
comando ATTENZIONE: accento grave (es. è)
– myVar = `echo $LOGIN_NAME`
– echo “Contenuto di myVar: $myVar”
Contenuto di myVar: dinatale
Sistemi Operativi - Script di Shell
13
Indice
•
•
•
•
•
•
Variabili
Caratteri particolari
Condizioni
if, for, while, case
Istruzioni particolari
Segnali
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
14
•7
•Sistemi operativi
Condizioni
• BASH test expr oppure [ expr ]
• TCSH ( cond )
$ cat test
#!/bin/tcsh
# Esempio di confronto (if) -> tcsh
set str1 = "abc"
set str2 = "abd"
echo "str1 = $str1; str2 = $str2"
if ($str1 == $str2) then
echo "str1 uguale a str2"
else
echo "str1 diversa da str2"
endif
$ ./test
str1 = abc; str2 = abd
str1 diversa da str2
Sistemi Operativi - Script di Shell
$ cat test
#!/bin/bash
# Esempio di confronto (if) -> bash
str1="abc“ (NO spazi)
str2="abd"
echo "str1 = $str1; str2 = $str2"
if test $str1 = $str2
(oppure if [ $str1 = $str2 ] (SPAZI [ ]))
then
echo "str1 uguale a str2"
else
echo "str1 diversa da str2"
fi
$ ./test
str1 = abc; str2 = abd
str1 diversa da str2
15
Confronto tra stringhe
• TCSH
– ==
– !=
uguale
diverso
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
• BASH
– =
– !=
– -n
– -z
uguale
diverso
lunghezza > di 0
lunghezza = 0
16
•8
•Sistemi operativi
Confronto tra numeri
• TCSH
– ==
– >=
– <=
– !=
– >
– <
uguali
maggiore o uguale
minore o uguale
diversi
maggiore
minore
– if ( $n1 >= $n2 ) then
…
endif
• BASH
– -eq
– -ge
– -le
– -ne
– -gt
– -lt
uguali
maggiore o uguale
minore o uguale
diversi
maggiore
minore
– if [ $n1 -ge $n2 ]
then
…
fi
Sistemi Operativi - Script di Shell
17
Operatori per file
•
• TCSH
– -d
directory
– -f
file normale
– -r
permesso di read
– -w
permesso di write
– -x
permesso di exec
– -z
dim(file) > 0
– -e
il file esiste
– if ( -d $myVar ) then
…
endif
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
BASH
– -d
– -f
– -r
– -w
– -x
– -s
directory
file normale
permesso di read
permesso di write
permesso di exec
dim(file) > 0
– if [ -d $myVar ]
ATTENZIONE agli spazi dopo
e prima delle [ ]
then
…
fi
18
•9
•Sistemi operativi
Operatori logici
• TCSH
– !
– &&
– ||
NOT
AND
OR
Sistemi Operativi - Script di Shell
• BASH
– !
– -a
– -o
NOT
AND
OR
19
Indice
•
•
•
•
•
•
Variabili
Caratteri particolari
Condizioni
if, for, while, case
Istruzioni particolari
Segnali
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
20
•10
•Sistemi operativi
L’istruzione if
• TCSH
– if (espressione) then
istruzioni
else if (espressione) then
istruzioni
else
istruzioni
endif
• BASH
– if [ espressione ]
then
istruzioni
elif [ espressione ]
then
istruzioni
else
istruzioni
fi
Sistemi Operativi - Script di Shell
21
L’istruzione for
• TCSH
– foreach myVar (elenco)
istruzioni
end
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
• BASH
– for myVar in elenco
do
istruzioni
done
22
•11
•Sistemi operativi
L’istruzione for - Esempi
• TCSH
– foreach x (1 2 3 4)
echo $x
end
– foreach x (`ls`)
mv $x ../backup
end
• BASH
– for x in 1 2 3 4
do
echo $x
done
– for x in `ls`
do
mv $x ../backup
done
Sistemi Operativi - Script di Shell
23
L’istruzione while
• TCSH
– while (espressione)
istruzioni
end
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
• BASH
– while [ espressione ]
do
istruzioni
done
24
•12
•Sistemi operativi
L’istruzione while - Esempio
• TCSH
– set ind = 0
while ($ind <= 15)
touch “xxx$ind”
set ind = `expr $ind + 1`
end
• BASH
– ind=0;
while [ $ind -le 15 ]
do
touch "xxx$ind"
ind=`expr $ind + 1`
done
ATTENZIONE agli spazi
vicino all’= e vicino alle [
], nonché alle posizioni
delle $
Sistemi Operativi - Script di Shell
25
L’istruzione case
• TCSH
– switch (str)
case str1 | str2:
istruzioni
breaksw
default:
istruzioni
breaksw
endsw
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
• BASH
– case str in
str1)
istruzioni ;;
str2 | str3)
istruzioni ;;
*)
istruzioni ;;
esac
26
•13
•Sistemi operativi
L’istruzione case - Esempio
• TCSH
– switch ($1)
case 01 | 1:
echo “Gennaio”
breaksw
...
default:
echo “Non valido”
breaksw
endsw
Sistemi Operativi - Script di Shell
• BASH
– case $1 in
01 | 1) echo “Gennaio”;;
02 | 2) echo “Febbraio”;;
...
12) echo “Dicembre”;;
*) echo “Non valido”;;
esac
27
Indice
•
•
•
•
•
•
Variabili
Caratteri particolari
Condizioni
if, for, while, case
Istruzioni particolari
Segnali
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
28
•14
•Sistemi operativi
Input interattivo
• read var1 var2 … varn
#!/bin/bash
echo –n “Scrivi qualcosa: “ (il –n non va a capo)
read one two other
echo “La prima parola è: $one”
echo “La seconda parola è: $two”
echo “Il resto della linea è: $other”
• In tcsh
echo -n "Scrivere due parole su di una riga: "
set stringa = `cat`
set stringa1 = `echo $stringa | cut -f 1 -d " " -`
echo "Prima parola: $stringa1"
set stringa2 = `echo $stringa | cut -f 2 -d " " -`
echo "Seconda parola: $stringa2"
Sistemi Operativi - Script di Shell
29
Cut, Paste
•
Cut and paste permettono di tagliare
ed incollare su file; sono molto utili
negli script
• Cut è stato visto nel lucido
precedente
• Paste permette di creare un file
usando come colonne dati presi per
esempio dal cut
$ cal 1 2003
January 2003
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
$ cal 1 2003 | cut -b1-2 > file_a
$ cal 1 2003 | cut -b19-20 > file_b
$ paste -s file_a file_b
Su
5
12
19
26
Sa
4 11
18
25
$ paste file_a file_b
Su
Sa
4
5
11
12
18
19
25
26
30
•15
•Sistemi operativi
Tr, Wc, Uniq, Pr
• tr permette di trasfomare un file agendo sui caratteri
contenuti; ad es. tr a-z A-Z < a > b salva in b il file a dopo
aver trasformato i caratteri minuscoli in maiuscoli
• wc (word count): conta il numero di byte (wc –c nomefile),
di linee (wc –l), di parole (wc –w)
• uniq da utilizzare in pipe ad es. con sort per eliminare i
duplicati
es: ….| sort | uniq
• pr stampa i file di testo con un minimo di formattazione; in
particolare pr –n stampa aggiungendo i numeri di linea
(utilissimo per stampare il codice)
Sistemi Operativi - Script di Shell
31
Operazioni aritmetiche
• In bash
$[expr]
num1=5
num2=$[$num1*3+1] (NO spazi vicino all’=)
Altrimenti usare il comando expr
• In tcsh usare le espressioni come mostrato
set num1 = 5
@ num2 = $num1 * 3 + 1 (@ può sostituire set, ma non vale il
contrario)
echo $num1 $num2
stampa -> 5 16
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
32
•16
•Sistemi operativi
Redirezione I/O con bash
•
•
•
•
•
>
2>
&>
>>
<
stdout su file
stderr su file
stdout+stderr su file
stdout appeso a file
stdin da file
Sistemi Operativi - Script di Shell
33
Modificatori di variabili per tcsh
• :r
il nome di un file senza estensione
• :e
l'estensione di un file
• :h
la "testa" di un nome di file (il path)
• :t
la "coda" di un nome di file (no path)
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
34
•17
•Sistemi operativi
Esempio
• foreach i ($*)
echo “Estensione: “$i:e
echo “Nome senza estensione: “$i:r
echo “Path: “$i:h
echo “Nome senza path: “$i:t
end
exit 0
Sistemi Operativi - Script di Shell
35
Altro metodo
• un altro metodo (valido con ambedue i tipi di
shell) è quello di usare basename e dirname
$ cat test
#!/bin/tcsh
set i=0;
foreach i (`ls $1/*`)
echo "dirname $i = " `dirname
$i`
echo "basename $i = "
`basename $i`
end
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
$ test uno
dirname uno/a = uno
basename uno/a = a
dirname uno/b = uno
basename uno/b = b
$ ls -R uno/
uno/:
a b
36
•18
•Sistemi operativi
Indice
•
•
•
•
•
•
Variabili
Caratteri particolari
Condizioni
if, for, while, case
Istruzioni particolari
Segnali
Sistemi Operativi - Script di Shell
37
Segnali
• I programmi possono ricevere dei segnali
– Es: quando si preme CTRL-C il programma
viene interrotto. In realtà, quando il sistema
operativo riceve dalla tastiera l’informazione
della pressione di CTRL-C, invia un segnale al
processo
• Per inviare un segnale, si usa il comando kill
– kill -sig pid
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
38
•19
•Sistemi operativi
Segnali possibili
• Signal
interrupt
kill
alarm
Value Notes
2
generato quando si preme CTRL-C
9
terminazione forzata del processo
14
generato alla fine della system call
alarm()
Sistemi Operativi - Script di Shell
39
Comportamento dei processi
• Quando un processo riceve un segnale, può:
– ignorare il segnale (tranne che per il segnale
kill)
– accettare l’azione di default del segnale
(comportamento di default)
– eseguire del codice particolare per gestire
quel segnale
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
40
•20
•Sistemi operativi
Gestione dei segnali negli script
• Per gestire i segnali, si usa il comando trap:
• trap “command” signal_list
– esegue l’azione espressa in command,
quando si genera uno dei segnali nella lista
• trap signal_list
– ripristina il comportamento di default
• trap “” signal_list
– ignora il segnale
Sistemi Operativi - Script di Shell
41
Esempio
• In una porzione dello script di seguito viene
utilizzato un file temporaneo:
• trap “rm -f /var/tmp/file.tmp; exit 0” 2
touch /var/tmp/file.tmp
# …
trap 2
# parte finale dello script
Sistemi Operativi - Script di Shell
•G. Di Natale, S. Di Carlo, B. Montrucchio- v. 3
42
•21