Linguaggio di bash per esempi Tre modi per quotare quotare: signica trattare caratteri speciali come normali caratteri es. di aratteri speciali: $, blank, apici, 1. backslash: per quotare un solo carattere speciale 2. ppie virgolette: consente di scrivere stringhe contenenti più caratteri speciali; le variabili precedute da $ vengono sostituite dal loro valore 3. apici inversi: compaiono sul lato destro di un assegnamento, circondan un coman. Il coman viene eseguito e il suo valore memorizzato nella variabile sul lato sinistro Esempio Da linea di coman: > prova="ls -l" > echo $prova ls l > prova=`ls -l` > echo $prova total 2 drwxr--r-- utente1 gruppo1 pippo -rwxrwxrwx utente1 gruppo1 pluto 1
Introduzione agli esempi nei prossimi esempi supporremo di ver eseguire una medesima elaborazione su di un certo numero di le di dati contenuti in una stessa directory Vedremo diversi script che eseguono lo stesso compito, in modi via via più sosticati Useremo tali script per introdurre alcuni dei costrutti principali della programmazione di shell bash Esempio1: uso degli apici inversi DDir=../../Dati/DatiScript temp=`wc -l $DDir/dati1.raw` echo "numero linee di dati1.raw" temp=`wc -l $DDir/dati2.raw` echo "numero linee di dati2.raw" temp=`wc -l $DDir/dati2.raw` echo "numero linee di dati3.raw" Esempio2: comportamento di wc che legge da stdin DDir=../../Dati/DatiScript temp=`wc -l < $DDir/dati1.raw` echo "numero linee di dati1.raw" $temp temp=`wc -l < $DDir/dati2.raw` echo "numero linee di dati2.raw" $temp temp=`wc -l < $DDir/dati3.raw` echo "numero linee di dati3.raw" $temp 2
Istruzione if else if [ condizione ] istruzioni else istruzioni le parentesi [ ] sono obbligatorie come pure lo spazio fra esse e la condizione il ramo else è facoltativo Esempio 3: uso di un parametro e di -eq DDir=../../Dati/DatiScript if [ $1 -eq 1 ] valori: o numeri o stringhe temp=`wc -l $DDir/dati1.raw` echo "numero linee di dati1.raw" $temp temp=`wc -l $DDir/dati2.raw` echo "numero linee di dati2.raw" $temp temp=`wc -l $DDir/dati2.raw` echo "numero linee di dati3.raw" $temp else temp=`wc -l < $DDir/dati1.raw` echo "dati1.raw" $temp temp=`wc -l < $DDir/dati2.raw` echo "dati2.raw" $temp temp=`wc -l < $DDir/dati2.raw` echo "dati3.raw" $temp Operatori di confronto stringhe numeri interi = uguale!= diverso -gt -lt -ge -le -eq -ne maggiore di minore di maggiore uguale minore uguale uguale diverso sono operatori che richieno due operandi 3
Test su le sono operatori che richieno un solo operan -f il le esiste -s il le non è vuoto -r il le è leggibile -w il le è modicabile -x il le è eseguibile -d il le è una directory -h il le è un link simbolico Esempi: [ -r cumento.txt ] [ -h mieidati ] Composizione di condizioni AND [ condizione1 ] && [ condizione2 ] [ condizione1 ] [ condizione2 ] OR Esempio: uso di f e di condizioni composte if [ -d $1 ] echo $1 directory if [ -d $1 ] && [ -w $1 ] echo $1 directory scrivibile 4
For in for variabile in istruzioni lista_valori il corpo di istruzioni all interno di viene eseguito per tutti i valori contenuti nella lista lista_valori lista_valori può essere protta a seguito dell esecuzione di un coman Esempio4: uso di for in lista di tutti i le contenuti DDir=../../Dati/DatiScript in $DDir che hanno estensione raw; *.raw indica tutti i le che if [ $1 -eq 1 ] hanno estensione raw for myle in $DDir/*.raw temp=`wc -l $myle` echo "numero linee di dati1.raw" $temp else for myle in $DDir/*.raw temp=`wc -l < $myle` echo "dati2.raw" $temp Vantaggio: prescin dal numero di le effettivamente contenuti nella directory Altro esempio la lista è protta utilizzan il coman ls for myle in `ls` echo la directory contiene $myle 5
Uso di export e sottoscript export DDir=../../Dati/DatiScript if [ $1 -eq 1 ] sottoscript1 else sottoscript2 for myle in $DDir/*.raw temp=`wc -l $myle` echo "numero linee di dati1.raw" $temp for myle in $DDir/*.raw temp=`wc -l < $myle` echo "dati2.raw" $temp while nito=go occhio agli spazi!!! while [ condizione ] istruzioni while [ $nito!= quit ] echo ancora un giro! echo vuoi nire? [go/quit] read nito Let let let operan1 operatore operan2 variabile = espressione operatori: * + / - % consente di eseguire il calcolo di semplici espressioni in uno script di shell 6
Esempio let ripeti = 1 while [ $ripeti lt 3 ] echo hip hip let ripeti = ripeti + 1 echo hurra! usiamo let per incrementare una variabile di ciclo Esercizio: parte (a) datigrezzi home mieiscript datiela creare nella propria home directory tre sottodirectory: datigrezzi: conterrà i le da elaborare mieiscript: conterrà gli script realizzati datiela: conterrà i risultati dell elaborazione Esercizio: parte (a) home datigrezzi inserire in datigrezzi alcuni le di dati (di fantasia) da elaborare: potete copiare anche quelli usati la lezione scorsa mieiscript datiela copiare in mieiscript gli script usati la lezione scorsa per cercare e spezzare i record iniziali che vericavano un certo pattern in tre parti 7
Esercizio: parte (b) scrivere un programmino awk che: 1. legga in input i dati spezzati in prologo, nucleo, epilogo 2. restituisca in output quattro valori numerici: 1. il num. di record il cui nucleo inizia per la lettera a 2. il num. di record il cui nucleo inizia per la lettera b 3. il num. di record il cui nucleo inizia per la lettera c 4. il num. di record il cui nucleo inizia per la lettera d Esercizio: parte (c) scrivere uno script di shell che: 1. abbia denita una variabile DATI, il cui valore è la directory contenente i dati grezzi e una variabile ELA il cui valore è la directory nella quale verranno salvati i dati elaborati 2. esegue un ciclo su tutti i le contenuti in DATI e per cascuno di questi: 1. applica il programma awk scritto al passo (b) salvan il risultato in un le di output contenuto in ELA (attenzione, il risultato va aggiunto all eventuale contenuto precedente, il le non deve essere riscritto) secon un formato che deniremo 2. esegue lo script di shell contadati, che deniremo Esercizio: formato del le di output nome del primo le elaborato protto dallo script caso A: numero caso B: numero caso C: numero caso D: numero protto dal programma awk nome del secon le elaborato.. 8
Esercizio: contadati contadati restituisce il numero di righe (quindi di record) del le il cui nome è memorizzato nella variabile lecorrente, creata dallo script chiamante e da questo esportata 9