Il sistema operativo LINUX Script di Shell Giorgio Di Natale <dinatale@polito.it> Stefano Di Carlo <dicarlo@polito.it> Bartolomeo Montrucchio <montru@polito.it> 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 2
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 4
Variabili 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 myvar=ciao myvar= Una prova myvar=$othervar NOTA: per le variabili di ambiente usare poi export; unset per cancellare ambedue i tipi Sistemi Operativi - Script di Shell 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 6
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 1 echo $#v 3 echo $v[2] b echo $v[1-2] a b unset v echo $#v Undefined variable: v Sistemi Operativi - Script di Shell 8
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 10
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 12
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 14
Condizioni ( 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 test expr oppure [ expr ] $ 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 Sistemi Operativi - Script di Shell str1 diversa da str2 15 Confronto tra stringhe == uguale!= diverso = uguale!= diverso -n lunghezza > di 0 -z lunghezza = 0 Sistemi Operativi - Script di Shell 16
Confronto tra numeri == uguali >= maggiore o uguale <= minore o uguale!= diversi > maggiore < minore if ( $n1 >= $n2 ) then endif -eq uguali -ge maggiore o uguale -le minore o uguale -ne diversi -gt maggiore -lt minore if [ $n1 -ge $n2 ] then fi Sistemi Operativi - Script di Shell 17 -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 Operatori per file -d directory -f file normale -r permesso di read -w permesso di write -x permesso di exec -s dim(file) > 0 if [ -d $myvar ] ATTENZIONE agli spazi dopo e prima delle [ ] then fi Sistemi Operativi - Script di Shell 18
Operatori logici! NOT && AND OR! NOT -a AND -o OR Sistemi Operativi - Script di Shell 19 Indice Variabili Caratteri particolari Condizioni if, for, while, case Istruzioni particolari Segnali Sistemi Operativi - Script di Shell 20
L istruzione if if (espressione) then else if (espressione) then else endif if [ espressione ] then elif [ espressione ] then else fi Sistemi Operativi - Script di Shell 21 L istruzione for foreach myvar (elenco) end for myvar in elenco do done Sistemi Operativi - Script di Shell 22
L istruzione for - Esempi foreach x (1 2 3 4) echo $x end foreach x (`ls`) mv $x../backup end for x in 1 2 3 4 do echo $x done forx in `ls` do mv $x../backup done Sistemi Operativi - Script di Shell 23 L istruzione while while (espressione) end while [ espressione ] do done Sistemi Operativi - Script di Shell 24
L istruzione while - Esempio set ind= 0 while ($ind <= 15) touch xxx$ind set ind = `expr $ind + 1` end 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 switch(str) case str1 str2: breaksw default: breaksw endsw case str in str1) ;; str2 str3) ;; *) ;; esac Sistemi Operativi - Script di Shell 26
L istruzione case - Esempio switch ($1) case 01 1: echo Gennaio breaksw... default: echo Non valido breaksw endsw case $1 in 01 1) echo Gennaio ;; 02 2) echo Febbraio ;;... 12) echo Dicembre ;; *) echo Non valido ;; esac Sistemi Operativi - Script di Shell 27 Indice Variabili Caratteri particolari Condizioni if, for, while, case Istruzioni particolari Segnali Sistemi Operativi - Script di Shell 28
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" Input interattivo 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 $ 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 Sistemi Operativi - Script di Shell 30
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 32
Redirezione I/O con bash > stdout su file 2> 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 34
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 $ test uno dirname uno/a = uno basename uno/a = a dirname uno/b = uno basename uno/b = b $ ls -R uno/ uno/: a b Sistemi Operativi - Script di Shell 36
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 38
Segnali possibili Signal Value Notes interrupt 2 generato quando si preme CTRL-C kill 9 terminazione forzata del processo alarm 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 40
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 42