Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/PUZZO DI MERDA E NON MI LAVO MAI!
- #!/bin/bash
- #scompone le stringhe dei file fino a ricavare l'ultima citta', quella di arrivo
- function trova_arrivo {
- y=`expr index "$string" "$"`
- #itero fino all'ultima occorrenza del carattere $
- while [[ $y -ne 0 ]]; do
- string=${string:$y}
- y=`expr index "$string" "$"`
- done
- }
- #distinguo i due casi: ho l'opzione -a oppure non ho l'opzione -a
- function check_arrivo {
- if [[ $arrivo = default ]]; then
- inserisci
- else
- trova_arrivo
- if [[ $string = $arrivo ]]; then
- inserisci
- fi
- fi
- }
- #distinguo i due casi: ho l'opzione -p oppure non ho l'opzione -p; in entrambi i casi dovro' verificare se ho o meno l'opzione -a
- function check_partenza {
- if [[ $partenza = default ]]; then
- check_arrivo
- else
- y=`expr index "$string" "$"`
- part=${string:0:`expr $y - 1`}
- string=${string:$y}
- #mi interessano solo le stringhe in cui la citta' di partenza coincide con quella passata come parametro
- if [[ $part = $partenza ]]; then
- check_arrivo
- fi
- fi
- }
- #gestisce gli array degli utenti e delle offerte e richieste a loro corrispondenti
- function inserisci {
- bool_off=0
- bool_rich=0
- index_array=0
- #cerco se nell'array degli utenti l'offerente e/o il richiedente estratti dalla stringa corrente sono gia' presenti
- while [[ $index_array -lt ${#utenti[@]} && ( bool_off -eq 0 || bool_rich -eq 0 ) ]]; do
- if [[ -n $off && ${utenti[$index_array]} = $off ]]; then
- #se c'e' gia' l'offerente, incremento l'elemento corrispondente nell'array delle offerte accettate
- offerte[$index_array]=`expr ${offerte[$index_array]} + 1`
- bool_off=1
- elif [[ -n $rich && ${utenti[$index_array]} = $rich ]]; then
- #se c'e' gia' il richiedente, incremento l'elemento corrispondente nell'array delle richieste accettate
- richieste[$index_array]=`expr ${richieste[$index_array]} + 1`
- bool_rich=1
- fi
- index_array=`expr $index_array + 1`
- done
- #se l'offerente non c'e', lo aggiungo nell'array degli utenti e metto a 1 le sue offerte accettate
- if [[ -n $off && $bool_off -eq 0 ]]; then
- utenti[${#utenti[@]}]=$off
- offerte[${#offerte[@]}]=1
- richieste[${#richieste[@]}]=0
- fi
- #se il richiedente non c'e', lo aggiungo nell'array degli utenti e metto a 1 le sue richieste accettate
- if [[ -n $rich && $bool_rich -eq 0 ]]; then
- utenti[${#utenti[@]}]=$rich
- offerte[${#offerte[@]}]=0
- richieste[${#richieste[@]}]=1
- fi
- }
- #metto tutti i parametri in una variabile
- param=("$@")
- #length e' la sua lunghezza
- length=$#
- utente=default
- arrivo=default
- partenza=default
- if [[ "$#" -eq "0" ]];
- then
- #se non ci sono parametri, esco
- exit 1
- fi
- counter=0
- #inserisco i nomi dei file validi in file e li rimuovo da param
- while [[ $counter -lt $length ]]; do
- if [[ -s ${param[$counter]} ]]; then
- #accedo alla posizione pari alla lunghezza dell'array
- log[${#log[@]}]=${param[$counter]}
- unset param[$counter]
- fi
- counter=`expr $counter + 1`
- done
- if [[ ${#log[@]} -eq 0 ]]; then
- #se non ci sono file validi esco
- exit 1
- fi
- #devo aggiornare length alla lunghezza attuale di param
- length=`expr $length - ${#log[@]}`
- counter=0
- while [[ $counter -lt $length ]]; do
- #ogni volta controllo che sia la prima volta che trovo questa opzione (variabile a default) e che il parametro dopo non sia un'altra opzione
- case ${param[$counter]:0:2} in
- -u) if [[ ${param[`expr $counter + 1`]:0:1} != "-" && $utente = default ]]; then
- utente=${param[`expr $counter + 1`]}
- else
- exit 1
- fi
- ;;
- -a) if [[ ${param[`expr $counter + 1`]:0:1} != "-" && $arrivo = default ]]; then
- arrivo=${param[`expr $counter + 1`]}
- else
- exit 1
- fi
- ;;
- -p) if [[ ${param[`expr $counter + 1`]:0:1} != "-" && $partenza = default ]]; then
- partenza=${param[`expr $counter + 1`]}
- else
- exit 1
- fi
- ;;
- *) exit 1
- ;;
- esac
- #devo incrementare di 2 per arrivare alla prossima opzione
- counter=`expr $counter + 2`
- done
- counter=0
- #inizio a scorrere l'array dei file
- while [[ $counter -lt ${#log[@]} ]]; do
- #apro il file corrente in sola lettura
- exec 3< ${log[$counter]}
- read -u 3 string
- #scorro il file finche' ci sono stringhe da leggere
- while [[ -n $string ]]; do
- #cerco la prima occorrenza del carattere $ nella stringa corrente
- y=`expr index "$string" "$"`
- #l'offerente e' il pezzetto di stringa precedente
- off=${string:0:`expr $y - 1`}
- #la nuova stringa partira' dal carattere immediatamente seguente la prima occorrenza di $
- string=${string:$y}
- #faccio uguale per il richiedente
- y=`expr index "$string" "$"`
- rich=${string:0:`expr $y - 1`}
- string=${string:$y}
- if [[ $utente = default ]]; then
- check_partenza
- else
- if [[ $off = $utente ]]; then
- rich=""
- check_partenza
- fi
- if [[ $rich = $utente ]]; then
- off=""
- check_partenza
- fi
- fi
- #itero
- read -u 3 string
- done
- #chiudo il file descriptor
- exec 3>&-
- #vado a leggere il file seguente
- counter=`expr $counter + 1`
- done
- #stampo i risultati
- cont=0
- while [[ cont -lt ${#utenti[@]} ]]; do
- echo ${utenti[$cont]}:${offerte[$cont]}:${richieste[$cont]}
- cont=`expr $cont + 1`
- done
- exit 0
Advertisement
Add Comment
Please, Sign In to add comment