---------------------------------------------------------------------------- Scuola di Specializzazione in Fisica Sanitaria dell'Universita' di Bologna Marcello Galli, Anno 2006-2007 Lezioni di Informatica http://www.helldragon.eu/marcello/galli_lezioni/ ---------------------------------------------------------------------------- Esempi di semplici procedure di shell Si ricorda che la procedura deve essere contenuta in un file eseguibile, si puo' rendere eseguibile un file con: chmod a+x nomefile I files con le procedure iniziano con la riga: #!/bin/bash questo permette al sistema di riconoscerle come procedure bash, e quindi di creare un sub-shell che esegue la procedura. /bin/bash e' il nome del programma che esegue questa procedura, in questo caso la shell bash. -------------------------- esempio : chisono --------------------------------------- #!/bin/bash # semplice procedura che mostra alcune variabili # d'ambiente , mostra un esempio di costrutto" 'case" # mostra un esempio di costrutto if #set -e -v # permette di vedere le singole istruzini eseguite # e di trovare gli errori della procedura a=`whoami` # il comando whoami viene eseguito, il suo output # viene assegnato alla variabile a # anche la variabile $USER contiene il nome dell'utente echo " Io sono: $USER " # i delimitatori " si possono omettere echo la mia casa e\': $HOME # \' per scrivere: ' echo " ora sono nella directory: $PWD " echo if [ $PWD = ~ ] ; then # ~ indica il direttorio primcipale echo sono nella mia directory principale elif [ $PWD != ~ ] ; then echo 'non sono nella $HOME ' ; echo ma in $PWD ;# qui $HOME non e' sostituito fi case $a in studenti* ) echo " sono uno studente" ;; root ) echo " sono il padrone del computer" ;; * ) echo e non so a che categoria appartengo ... ;; esac -------------------------- esempio : chivala --------------------------------------- #!/bin/bash # semplice procedura che mostra l'uso del costrutto for # e quello del costrutto while # Si guarda , a intervalli fissi, chi e' collegato # e si cerca di mandargli un messaggio, l'utente lo puo' # ricevere solo se ha abilitato la ricezione di messaggi # con il comando: mesg y while true ; do # loop infinito for a in ` who | cut -f1 -d" " | uniq ` ; do # uso della pipe per formattare i dati echo " e' collegato: $a " if [ $a != $USER ] ; then echo " ciao, $a ti vedo collegato " | write $a ; fi done sleep 5 # la procedura si ferma per alcuni secondi done -------------------------- esempio: zip_to_dir --------------------------------------- #!/bin/bash # questa procedura espande una serie di archivi di tipo zip, # facendo per ognuno una directory in cui viene # messo il contenuto dell'archivio , anche gli archivi # vengono messi nelle directory create for i in `ls *.zip` do echo '====>' $i c=${i%.zip} # tolgo il suffisso .zip echo $c mkdir $c # faccio la directory mv $i $c # mi sposto nella directory cd $c pwd unzip $i # qui espando il file cd .. done -------------------------- esempio: dir_to_zip --------------------------------------- #!/bin/bash # # questa procedura trasforma una serie di directories in # tanti archivi di tipo zip , il nome dell'archivio e' il # nome della directory, con suffisso .zip # for i in * do if [ -d "$i" ] ; then # se e' una directory echo '====>' $i if [ -f "$i.zip" ] ; then # se trovo un vecchio archivio zip lo salvo mv "$i.zip" $i.zip.old fi cd $i # nella directory creo l'archicio zip $i.zip * mv $i.zip .. # poi lo sposto cd .. fi done -------------------------- esempio: numeri --------------------------------------- #!/bin/bash # semplice procedura che mostra l'uso di variabili # numeriche nella bash shell # Si mostra anche l'uso degli argomenti di una procedura, # si mostra come impostare il "return code" # #set -e -v if (( $# != 2 )) ; then # controllo il numero di argomenti echo " errore, voglio 2 numeri come argomenti " exit 1 ; # esce e come "return code mette 1 : falso fi echo "mi hai dato i numeri : $1 $2 " a=$(( $1 + $2 )) # sistassi per valutare espressioni numeriche let b=$1-$2 # si puo' anche fare cosi' # ( ma attenzione a non mettere spazi accanto a '=' e '-') echo La somma vale: $a, la differenza: $b if [ $1 -lt $2 ] ; then echo " $1 < $2 " elif [ $1 -gt $2 ] ; then echo " $2 < $1 " else echo " i numeri sono eguali " fi exit 0 # e' andato tutto bene , esce col codice 0 : vero # Uso del "return code" ed esecuzione condizionale dei comandi: # se scrivo: # numeri || echo "ARG" # numeri da errore ( return code 1 ) e viene eseguito il secondo comando # numeri 1 2 || echo "AAARG" # qui numeri non da errore e non vedo AAARG sul terminale # numeri 1 2 && echo "OK" # Con "&&" il secondo comando viene eseguito solo se il primo da return code 0 # esempio: # numeri 1 2 && echo "OK" -------------------------- esempio: cerca --------------------------------------- #!/bin/bash # procedura che cerca un file in modo ricorsivo, # a partire da una directory data. # #set -e -v thisprog="` realpath $0 `" # trovo il nome con tutto il path #echo " cerco $2 in $1 , con:$0 $thisprog " # controllo degli argomenti : case $# in 0|1) echo " Errore, dare directory e stringa da carcare " exit 1 ;; 2) if test ! -d $1 ; then echo " Errore, il parametro 1 deve essere una directory " exit 2 fi if test ! $2 ; then # una stringa non nulla e' vera echo " Errore nella stringa da cercare " exit 3 fi ;; *) echo " Errore, servono solo: directory e stringa da carcare " exit 4 ;; esac cd $1 #echo " vado in `pwd` " for i in * ; do # echo " esame file :$i " if [ -f $i ] ; then # echo " is a regular file " case $i in *$2*) echo " file found: `pwd`/$i " if [ -r $i ] ; then echo " readable " ; fi if [ -w $i ] ; then echo " writable " ; fi if [ -x $i ] ; then echo " executable " ; fi ;; esac elif [ -d $i ] ; then # echo " is a directory " case $i in *$2*) echo " directory found: `pwd` $i " echo " dir content: " echo "--------------" ls $i echo "--------------" ;; esac $thisprog $i $2 fi done