Banners

SLAY Radio

Script bash per Lab. Sistemi Operativi

Nel mio CdL in Scienza e Teoria dell'Informatica a Siena, il corso Laboratorio di Sistemi Operativi è diviso in due moduli, uno di questi funge da introduzione al magico mondo di Linux. Come prova finale dobbiamo sostenere un orale e realizzare uno script in bash. Anche se, ovviamente secondo me, un esame di questo tipo è di dubbia utilità (poco "hardcore" e troppo "man"), devo ammettere che ho passato i miei brutti quarti d'ora. In molti casi la bash non ti viene incontro, anzi se sei alle prime armi ti vuole proprio male.
Pubblico lo script, magari servirà a qualche anima in pena. Potete anche scaricarlo direttamente, dato che nel post il codice non sarà perfettamente leggibile

Ah, il tutto è stato fatto in poco tempo e ripeto di non essere un patito di scripting bash, quindi commentate pure per migliorie, bombe a mano, etc...etc...

 
 
#!/bin/bash
 
function usage {
    echo
    echo "Uso:"
    echo "./newtrash file1 [file2...fileN] [-d num] [-s num,}num,{num] [-l] [-i] [-int]"
    echo
    echo "Opzioni:"
    echo "-d num                  sposta nella directory trash tutti i file la cui"
    echo "             data di ultimo accesso sia antecedente a num giorni"
    echo "-s num,}num2,{num3   sposta nella directory trash tutti i file la cui"
    echo "            dimensione sia num e/o >num e/o <num rispettivamente"
    echo "                  Ogni numero esprime n blocchi da 512 byte"
    echo "-l           sposta nella directory trash tutti i link"
    echo "-i           sposta nella directory trash i files indicati senza"
    echo "            distinguere tra maiuscole e minuscole"
    echo "-int           sposta nella directory trash i files chiedendo"
    echo "            per ciuscuno conferma"
}
   
paramnumber=$(($#))  #Numero di parametri passati allo script da riga di comando
paramarray=($*)            #Array contente i parametri passati allo script da riga di comando
counter=0
noexec=0    #flag per sapere quando devo stampare il messaggio per la conferma dell'eliminazione
filecounter=0
fori=0        #fori = flag per l'opzione -i. Mi serve per sapere quando stampare il messaggio
                  #per la conferma dell'eliminazione. Vedere la voce -int nel case
 
if [ ! -d "$HOME/trash" ]                #Controlla se esiste la directory trash nella home
then                            #se non esiste viene creata
    mkdir "$HOME/trash"
fi
 
while [ ! "`expr match "${paramarray[$(($filecounter))]}" '\(-\)'`" = "-" ] && [ $filecounter -lt $# ]
do                            #Conta quanti file sono stati passati
    filecounter=$(( $filecounter + 1 ))               #da riga di comando
done
 
if [ $filecounter -eq 0 ]
then
    echo "E' necessario specificare almeno un file"
    usage
    exit
fi
 
counter=$filecounter
while [ $counter -ne $paramnumber ]
do
    case "${paramarray[$counter]}" in
        -d)
            nextvalidparam=`expr match "${paramarray[$(($counter + 1))]}" '\([0-9]*[0-9]\)'`
            if [ ! -z $nextvalidparam ]                        #E' necessario eseguire IF annidati in quanto
            then                                    #se una stringa è NULL la bash se ne ha a male
                if [ $nextvalidparam = ${paramarray[$(($counter + 1))]} ]    #e non esegue tutti i confronti
                then
                    commandstring=" -atime +${paramarray[$(($counter + 1))]} "$commandstring
                else
                    echo "Il parametro per l'opzione -d non è valido"
                    usage
                    exit
                fi
            else
                echo "Il parametro per l'opzione -d non è valido"
                usage
                exit
            fi
            ;;
        -s)
            sizevalidparam=${paramarray[$(($counter + 1))]}                #Primo controllo sul parametro dell'opzione
            sizevalidparam=${sizevalidparam/",}"/""}                #Guardo se ci sono
            sizevalidparam=${sizevalidparam/"
,{"/""}                #caratteri strani oltre a quelli
            sizevalidparam=${sizevalidparam/"
}"/""}                    #che mi interessano
            sizevalidparam=${sizevalidparam/"
{"/""}
            sizevalidparam=${sizevalidparam/"
,"/""}
            sizeparam=`expr match $sizevalidparam '\([0-9]*[0-9]\)'`
            if [ ! -z $sizeparam ]
            then
                if [ "
$sizevalidparam" = "$sizeparam" ]
                then
                    sizevalidparam=${paramarray[$(($counter + 1))]}        #Metto il parametro dell'opzione
                    sizevalidparam=${sizevalidparam/"
,}"/" "}        #dentro un array per poter contare
                    sizevalidparam=${sizevalidparam/"
,{"/" "}        #se ci sono al massimo tre opzioni
                    sizevalidparam=${sizevalidparam/"
}"/" "}
                    sizevalidparam=${sizevalidparam/"
{"/" "}
                    sizevalidparam=${sizevalidparam/"
,"/" "}
                    array=( $sizevalidparam )                #Conversione in array per gestire meglio la stringa
                    if [ ${#array[@]} -le 3 ]                # ${#array[@]} <- lunghezza dell'array
                    then                            #si possono accettare al massimo 3 argomenti per -s
                        sizeparam=${paramarray[$(($counter + 1))]}
                        if [ `expr match "
$sizeparam" '\([0-9]\)'` ]
                        then
                            sizeparam="
-size "$sizeparam
                        fi
                        sizeparam=${sizeparam/"
,}"/" -size +"}        #Formatto la stringa per renderla
                        sizeparam=${sizeparam/"
,{"/" -size -"}        #adatta al comando "find"
                        sizeparam=${sizeparam/"
}"/" -size +"}
                        sizeparam=${sizeparam/"
{"/" -size -"}
                        sizeparam=${sizeparam/"
,"/" -size "}
                        commandstring=$sizeparam"
"$commandstring
                    else
                        echo "
Parametri non validi per l'opzione -s"
                        exit
                        usage
                        exit
                    fi
                else
                    echo "Parametri non validi per l'
opzione -s"
                    usage
                    exit
                fi
            else
                echo "
Parametri non validi per l'opzione -s"
                usage
                exit      
            fi
            ;;
        -l)
            commandstring=" -type l "$commandstring                        #Per i links
            ;;
        -int)
            commandstring=$commandstring" -ok mv {} $HOME/trash ;"            #Per chiedere conferma
            noexec=1
            fori=1                                        #nello spostamento
            ;;
        *)
            if [ "`expr match "${paramarray[$(($counter))]}" '
\(-\)'`" = "-" ] && [ ${paramarray[$(($counter))]} != "-i" ]
            then
                echo "Il predicato "${paramarray[$(($counter))]}" non è valido"
                usage
                exit
            fi
            ;;
    esac
    counter=$(( $counter + 1 ))          
done
 
if [ $noexec -ne 1 ]                            #Se non è presente l'
opzione -int viene aggiunta in fondo alla stringa
then                                    #l'opzione -exec mv etc...etc.. per spostare i file senza conferma
    commandstring=$commandstring" -exec mv {} $HOME/trash ;"
fi
 
counter=0
while [ $counter -ne $paramnumber ]
do
    case "${paramarray[$counter]}" in
        -i)                                    #Trattato a parte perchè -iname richiede
            noexec=2                            #un parametro alla volta
            for (( i=0;i<$filecounter;i++ )); do
                commandstringtmp=""
                commandstringtmp="find -iname "${paramarray[$((i))]}$commandstring
                if [ $fori -eq 1 ]
                then
                    echo "Sei sicuro di voler spostare il file "${paramarray[$((i))]}"? Premere 'S' o 's' per confermare"
                fi
                #echo $commandstringtmp
                $commandstringtmp
            done
            ;;
    esac
    counter=$(( $counter + 1 ))
done
 
if [ $noexec -ne 2 ]
then
    for (( i=0;i<$filecounter;i++ )); do                        #Metto in testa alla stringa del comando i nomi dei file
        commandstring=${paramarray[$((i))]}" "$commandstring            #e successivamente il comando "find"
    done
    commandstring="find "$commandstring
    if [ $noexec -eq 1 ]                                #Controllo per chiedere conferma nel
    then                                        # caso si sia usata l'opzione -int
        echo "Sei sicuro di voler spostare i file specificati? Premere 'S' o 's' per confermare"
    fi
    #echo $commandstring
    $commandstring
fi
 
 
Pagina precedente 1 2 3 4 Prossima pagina
16 post

FileBrowser

Chatbox

  • felo: diaccio... ora adense e' anche per fa le chiapparelle sui domini ignudi  
  • LeX: Ciao Feloo! :D Bella notizia, mi serve qualcosa della Wiley...  
  • felo: su gorilla.it sconto del 30% su libri tecnici et universitari degli editori Wiley, Blackwell, Sybex, Wrox, Rockynook, Capstone Publishing, Jossey Bass e Mit Press  
  • LeX: Vabbè ora mi arriva una mail per ogni messaggio in berciobox... bello, ma vorrei almeno sapere come disabilitarlo :D  
  • LeX: Udiu mi è arrivato un messaggio di posta con scritto The rebitrh!
    Questa cosa mica l'ho capita :)  
  • felo: the rebitrh!  
  • felo: mi so teste' facebookato , pare interessante anche per sviluppare in social-oriented. more to come...  

Scrivi il codice captcha che stai vedendo.

Categorie

Moblog

  • La mia prima foto!

    La mia prima foto!

    Lunedì 15 Settembre 2008 8:10pm

Emblemi

Supporta Choose Opera-tan
rss
atom