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 |
FileBrowserChatboxCategorie
Amici |