Il sistema operativo UNIX Shell: uso avanzato e script Niccolò Battezzati <[email protected]> Politecnico di Torino Dip. Automatica e Informatica Sistemi Operativi - Introduzione 1 Programma • Linux: introduzione e comandi principali • Shell: l’interprete dei comandi • Linux: dettagli e comandi avanzati • Shell: uso avanzato e script • Il linguaggio di programmazione AWK • vi(m): un editor di testo Sistemi Operativi - Introduzione 2 Indice • Variabili • Funzioni • Costrutti di confronto (if e case) • Loop (for e while) • Read • Segnali Sistemi Operativi - Introduzione 4 Indice • Variabili • Funzioni • Costrutti di confronto (if e case) • Loop (for e while) • Read • Segnali Sistemi Operativi - Introduzione 5 Variabili • Variabili predefinite: • $0 nome script • $1,$2,...parametri • $# numero parametri • $* stringa con tutti i parametri • $? valore di ritorno dell’ultmo programma • $$ PID del processo • $?var ‘1’ se var e` stata definita • $#var il numero di elementi nell’array var Sistemi Operativi - Introduzione 6 Variabili - array • Sono gestite variabili vettoriali unidimensionali: Esempi: • var=(1 2 5 ”ciao”) • echo ${var[0]} • echo ${var[1-3]} • Utili nelle funzioni: • BASH_ARGV[] e BASH_ARGC Sistemi Operativi - Introduzione 7 Indice • Variabili • Funzioni • Costrutti di confronto (if e case) • Loop (for e while) • Read • Segnali Sistemi Operativi - Introduzione 8 Funzioni • Si possono definire delle funzioni, prima che vengano chiamate, con la seguente sintassi: [function] name () {commands} • Il valore di ritorno e` definito: • o dal valore dell’ultimo comando eseguito • o dal comando return • I parametri sono definiti con la notazione posizionale: • $1, $2, $3 ... • Le funzioni vengono chiamate con la seguente sintassi: • name param1 param2 ... Sistemi Operativi - Introduzione 9 Funzioni - esempio function printUsage { echo “Wrong number of parameters ($1)” echo “Usage: $0 param1 param2” exit 0 } ... if test $# -ne 2 then printUsage $# fi Sistemi Operativi - Introduzione 10 Indice • Variabili • Funzioni • Costrutti di confronto (if e case) • Loop (for e while) • Read • Segnali Sistemi Operativi - Introduzione 11 Costrutto if-then-fi • Sintassi: if condition then commands [elif condition then commands] [else commands] fi Sistemi Operativi - Introduzione • Condizioni: if test param op param oppure if [ param op param ] SERVONO gli SPAZI!!! 12 Flag di confronto • Confronto tra numeri: • • • • • • -eq -ne -gt -ge -lt -le vero se i due numeri sono uguali vero se i due numeri non sono uguali vero se il primo numero e` maggiore vero se il primo numero e` maggiore o uguale vero se il primo numero e` minore vero se il primo numero e` minore o uguale • Confronto tra stringhe: • = • != vero se le due stringhe sono uguali vero se le due stringhe non sono uguali Sistemi Operativi - Introduzione 13 Flag di confronto • Confronto per file: • • • • • -f -d -r -w -x vero se l’argomento e` un file normale vero se l’argomento e` una directory vero se l’argomento ha il permesso di lettura vero se l’argomento ha il permesso di scrittura vero se l’argomento ha il permesso di esecuzione • Operatori logici: • ! • -a • -o NOT AND OR Sistemi Operativi - Introduzione 14 Costrutto if - esempi if test $1 = “-r” then recursive_search=1 fi if [ $recursive_search –eq 1 –a –d $2 ] then find $2 –name *.c > $3 elif [ $recursive_search –eq 0 –a –d $2 ] then find $2 –maxdepth 1 *.c > $3 else printUsageAndExit fi Sistemi Operativi - Introduzione 15 Costrutto case-esac • Sintassi: case var in str1) commands ;; str2|str3) commands ;; ... *) commands ;; esac Sistemi Operativi - Introduzione 16 Costrutto case - esempi case $1 in 01 | 1) echo “Gennaio” ;; 02 | 2) echo “Febbraio” ;; ... 12) echo “Dicembre” ;; *) echo “Error: unknown month”;; esac Sistemi Operativi - Introduzione 17 Indice • Variabili • Funzioni • Costrutti di confronto (if e case) • Loop (for e while) • Read • Segnali Sistemi Operativi - Introduzione 18 Costrutto for-do-done • Sintassi: • 1: for (( expr1 ; expr2 ; expr3 )) do commands done • 2: for var in list... do commands done Sistemi Operativi - Introduzione 19 Costrutto for - esempi for (( i=0 ; i<10 ; i++ )) do echo $i done for i in `ls | grep *.c` do chown pippo:disney $i done Sistemi Operativi - Introduzione 20 Costrutto while-do-done • Sintassi: while condition do commands done Sistemi Operativi - Introduzione 21 Costrutto while - esempi i=0 while [ $i –lt 10 ] do echo $i i=$(($i+1)) done (per scambiare due colonne in un file): while read var1 var2 do echo $var2 $var1; done <file_in >file_out Sistemi Operativi - Introduzione 22 Indice • Variabili • Funzioni • Costrutti di confronto (if e case) • Loop (for e while) • Read • Segnali Sistemi Operativi - Introduzione 23 Read • read permette di leggere una riga da stdin, con la seguente sintassi: read var1 var2 ... varN • ogni parola (separata da spazi) viene messa in una variabile • l’ultima variabile contiene tutte le rimanenti parole • permette di fare input interattivo. Sistemi Operativi - Introduzione 24 read - esempi (per scambiare due colonne in un file): while read var1 var2 do echo $var2 $var1; done <file_in >file_out (input interattivo): echo –n “Insert a sentence: ” read w1 w2 others echo “Word 1 is: $w1” echo “Word 2 is: $w2” echo “The rest of the line is: $others” Sistemi Operativi - Introduzione 25 Indice • Variabili • Funzioni • Costrutti di confronto (if e case) • Loop (for e while) • Read • Segnali Sistemi Operativi - Introduzione 26 Segnali • I processi possono ricevere dei segnali, o dall’utente o da altri processi. Il processo puo` quindi decidere di: • ignorare il segnale • eseguire il comportamento di default • gestire il segnale • Per mandare un segnale si usa il comando kill –signal pid dove signal puo` essere un numero o un nome (come KILL o USR1 ecc.). Sistemi Operativi - Introduzione 27 Segnali • Per specificare il comportamento da adottare si usa il comando: trap [‘commands’] [signal...] 1. trap ‘commands’ signals... esegue commands alla ricezione di signals 2. trap ‘’ signals... ignora tutti i segnali signals 3. trap signals... ripristina il comportamento di default per i segnali signals. Sistemi Operativi - Introduzione 28 Segnali - esempi (per gestire il segnale SIGALRM): trap ‘echo mi sono svegliato’ ALRM (per ripristinare il valore di default): trap ALRM (per ignorare SIGUSR1 e SIGUSR2): trap ‘’ USR1 USR2 Sistemi Operativi - Introduzione 29