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