Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoTecla Di giovanni Modificato 9 anni fa
1
1 PROGRAMMAZIONE IN SHELL The Unix Programming Environment Kernigham - Pike
2
2 Osservazioni generali I vari interpreti dei comandi che si possono trovare su un sistema Unix (sh, csh, tcsh, ksh, bsh) sono molto simili fra loro Tutti funzionano anche come linguaggi di programmazione Tutti derivano dalla sh (shell) il primo interprete scritto per il sistema Unix Il programma sh si trova su qualsiasi macchina Unix, nella directory /bin
3
3 Osservazioni generali: Una sequenza di comandi shell puó essere data direttamente al terminale una riga dopo l’altra: prompt> ls -l prompt> date prompt> cp fileA fileB oppure scritta su un unica riga: prompt> ls -l; date; cp fileA fileB oppure inserita in un file di comandi, che viene detto: un Shell SCRIPT
4
4 Shell script un shell script puó essere eseguito con: prompt> sh scriptfile oppure puó essere trasformato in un nuovo comando del sistema rendendolo eseguibile: prompt> chmod a+x scriptfile prompt> scriptfile In ogni caso, il contenuto del file scriptfile viene interpretato usando la shell. Se si vuole che sia interpretato usando la csh bisogna aggiungere, come prima riga del file: #!/bin/csh
5
5 Shell Script: La stessa cosa vale se si usa la shell come linguaggio di programmazione. Si puó lanciare un programma shell in modo interattivo: prompt> sh/* entra in ambiente shell */ $ for i in fileA fileB > do > ls -l $i > done rwxr-xr-x st909090573fileA rwx------st909090200fileB $ exit/* esce dalla shell e torna in csh */ prompt>
6
6 Shell Script: oppure scrivere il programma in un shell script ed eseguirlo: for i in fileA fileB do ls -l $i done prompt> chmod a+x myscript prompt> myscript rwxr-xr-x st909090573fileA rwx------st909090200fileB prompt> myscript
7
7 Una directory di comandi personali La shell usa la variabile path settata nel file.cshrc per stabilire in quali directory cercare i comandi lanciati dall’utente. Ogni utente puó definire una propria directory di comandi, e poi modificare la variabile path in modo da lanciare i propri comandi senza specificare ogni volta il loro pathname (cioé proprio come se fossero un normale comando unix)
8
8 Una directory di comandi personali al fondo del file.cshrc inserire il comando: set path=($path ~myloginname/mycommanddir) /* aggiunge a path il nuovo pathname */ Eseguire poi il comando: source.cshrc /* rilegge il file.cshrc */ Ora i comandi dentro mycommanddir possono essere lanciati direttamente Attenzione: se aggiungete un nuovo file, perché sia immediatamente attivo date il comando: rehash
9
9 Lavorare in ambiente shell ATTENZIONE: tutto quello che vedremo funziona e si riferisce all’ambiente shell. Quando vi collegate al vostro account e usate un qualsiasi terminale virtuale state usando la cshell Per usare la shell in modalitá interattiva dovete entrare nell’ambiente shell lanciando: sh Per uscire dalla shell basta digitare dare il comando exit e ritornate alla cshell Il problema non si pone se usate shell script, che sono automaticamente interpretati usando la shell
10
10 Le variabili di shell La shell conosce un solo tipo di variabili: stringhe di caratteri Il nome di una variabile shell puó essere una qualsiasi sequenza di caratteri senza spazio e metacaratteri non quotati Lo stesso ambiente shell definisce ed usa un insieme di variabili per gestire correttamente la connessione dell’utente
11
11 Le variabili di shell dando il comando env si possono vedere tutte le variabili correntemente definite nell’ambiente di lavoro. Per definire una nuova variabile shell basta assegnarle un valore: prompt> myvar=pippo /* ricordate: niente spazi! */ per usare il valore di una variabile definita occorre anteporle il simbolo $ prompt> echo $myvar pippo prompt>
12
12 Assegnamento dell’output di un comando ad una variabile shell L’output di un comando puó essere assegnato ad una variabile shell, e poi usato: >pathname=`pwd` >echo $pathame >/docsrv/gunetti `pwd` apici
13
13 assegnazione di variabili da terminale echo “inserire nome e cognome:” read nome cognome echo “nome inserito = “ $nome echo “cognome inserito = “ $cognome prompt> myscript inserire nome e cognome: Mario Rossi nome inserito = Mario cognome inserito = Rossi prompt> myscript
14
14 Le variabili di shell Il valore di una variabile si usa direttamente: prompt> myvar1=/etc/passwd prompt> ls -l $myvar1 r-xr-xr-x root 4570 /etc/passwd Si puó concatenare ad un altro: prompt> myvar2=.old prompt> ls -l $myvar1$myvar2 r-xr-xr-x root 2620 /etc/passwd.old
15
15 Le variabili di shell Si puó concatenare una variabile ad una stringa qualsiasi racchiudendo il nome della variabile tra graffe o terminandolo con il back slash \: prompt> myvar1=/etc/pass prompt> ls -l ${myvar1}wd r-xr-xr-x root 4570 /etc/passwd oppure: prompt> ls -l $myvar1\wd.old r-xr-xr-x root 2620 /etc/passwd.old
16
16 Le variabili di shell Peró non si puó concatenare una variabile ad una stringa qualsiasi direttamente, perché quello diventa un nuovo nome di variabile non definita: prompt> myvar1=/etc/pass prompt> more $myvar1wd usage: more [...] [...] /*ERRORE nell’uso del more */ Le variabili non definite hanno il valore della stringa Null.
17
17 Alcune variabili predefinite: $$: PID della shell corrispondente $#: numero di argomenti di uno script shell $0: nome dello script shell $n: valore dell’ennesimo argomento dello script $HOME: home directory dell’utente $PWD: current working directory $path: elenco delle directory in cui cercare i comandi eseguiti
18
18 Script di uso delle variabili predefinite: file myscript: echo “questo script si chiama “ $0 “ ed ha PID = “ $$ echo “é stato chiamato con “ $# “argomenti” echo “il secondo argomento é “ $2 echo “é stato lanciato nella directory “ $PWD sh myscript qui quo qua questo script si chiama myscript ed ha PID 16123 é stato chiamato con 3 argomenti il secondo argomento é quo é stato lanciato nella directory /docsrv/gunetti/tmp
19
19 Il costrutto FOR for var in val_1 val_2... val_N do comandi shell done la variabile var assume in successione ad ogni ciclo, i valori val_1, val_2,..., val_N
20
20 Il costrutto FOR for var in * do comandi shell done la variabile var assume come valore, in successione ad ogni ciclo, il nome degli oggetti (file, sottodirectory) della directory corrente.
21
21 Il costrutto FOR for var do comandi shell done la variabile var assume come valore, in successione ad ogni ciclo, il nome degli argomenti passati in input. prompt> myscript pippo pluto myscript
22
22 Il costrutto FOR: esempio for i do grep $i elenco_telefonico done prompt> cerca_elenco rossi bianchi cerca_elenco
23
23 il comando TEST: test [-flag] espressione Restituisce true o false a seconda del tipo di test e dell’espressione coinvolta. Viene usato in tutti i costrutti condizionali: –if-then-else –while-do –until-do puó essere usato per testare variabili shell e file
24
24 il comando TEST: l’elenco completo dei flag é sul manuale. Esempi: –test s1 = s2 /* vero se s1=s2 - attenzione al blank */ –test s1 != s2 /* vero se s1 diverso da s2 */ –test s /* vero se s non é la stringa vuota */ –test -r file /* vero se file esiste ed é leggibile */ –test -f file && test -s file /* vero se file é regolare e non ha dimensione 0 -- || (doppia pipe) é l’or */ –test ! -s file /* vero se file e’vuoto -- ! é la negazione */ –test n1 -gt n2 /*vero se n1 é maggiore di n2 */ –test n1 -le n2 /* vero se n1 é minore o uguale a n2 */
25
25 if-then-else: if then [else ] fi il ramo else é opzionale piú if-then-else possono essere nidificati
26
26 if-then-else - esempio: var_A=ciao var_B=hello if test $1 = $var_A then echo “Ciao! Come stai?” else if test $1 = $var_B then echo “hello! Come stai?” else echo “non mi saluti?” fi
27
27 case Esecuzione in condizionale di piú alternative case in ) ;;......... ) ;; [*) ;;] esac
28
28 case - esempio: read saluto case $saluto in ciao) echo “CIAO!”; echo “Come stai?”;; hello) echo “Hello!”; echo “Come stai?”;; *) echo “EMBÉ?”;; esac
29
29 while - do / until - do while do done Esegue il loop se restituisce true until do done Esegue il loop se restituisce false
30
30 while - do - Esempio: who | grep $1 > tmpfile while test -s tmpfile /* tmpfile non é vuoto */ do echo “l’utente “ $1 “ é collegato” sleep 60 who | grep $1 > tmpfile done echo “l’utente “ $1 “ non é collegato”
31
31 until - do - Esempio: who | grep $1 > tmpfile until test ! -s tmpfile do echo “l’utente “ $1 “ é collegato” sleep 60 who | grep $1 > tmpfile done echo “l’utente “ $1 “ non é collegato” occhio alla negazione!
32
32 Selezione di porzioni di stringhe: cut -bX-Y filename –taglia verticalmente filename prelevando per ogni riga solo i caratteri dall’X-esimo all’Y-esimo echo “dipartimento” | cut -b3-7 –restituisce la stringa parti a=`who am i | cut -b1-4``hostname | cut -b1-4` –setta la variabile a come la concatenazione dei primi 4 caratteri del login e del nome dell’host.
33
33 Raggruppamento di comandi: ( lista di comandi ) –particolarmente utile per eseguire comandi in una directory particolare specificata all’interno delle parentesi: (cd subdir; rm tmpfile) al termine la directory corrente non é cambiata
34
34 Calcoli aritmetici: “expr” expr expr premette di usare le variabili shell con significato numerico, ed eseguire semplici calcoli: >div=2 >result=`expr 10 / $div` >echo $result 5 > Occhio agli spazi!
35
35 expr - Esempi: Cont=10 while test $cont -gt 0 do echo “cont = “ $cont cont=`expr $cont - 1` done l’uso di espressioni complesse è un pó goffo: result=`expr “(“ 10 \* 5 “)” / 2`
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.