POS/Lab 3 2020

Izvor: SI Wiki
Pređi na navigaciju Pređi na pretragu

Lab 3 se pojavljuje u četvrtom terminu vežbi.

Grupa 3

Zadatak 1

Postavka

Napisati skriptu koja obrađuje raspored autobuskih linija koji se nalazi u fajlu busScheduler. Svaki red je jedna linija po formatu vreme_polaska|polazno_mesto|dolazno_mesto. Unutar skripte postaviti putanju do fajla busScheduler. Skripta prima sledeće opcije, ukoliko bar jedna nije navedena prijaviti grešku:

Opcija -l bez parametra ispisuje ceo raspored autobuskih linija.
Opcija -f sa parametrom koji predstavlja naziv polaznog mesta. Ova opcija treba da ispiše samo linije čije je polazno mesto prosleđeno.
Opcija -a bez parametra dodaje novu liniju na kraj fajla busScheduler. Ako je navedana[sic] ova opcija skripta treba da obezbedi korisniku unos vremena, polaznog i dolaznog mesta. Potrebno je proveriti ispravnost unetog vremena, ono mora biti u 24-časovnom formatu hh:MM. Ukoliko nije treba prijaviti grešku korisniku i prekinuti skriptu.
Opcija -b sa parametrom koji predstavlja vreme u format hh:MM. Ova opcija treba da ispiše sve linije koje polaze nakon zadatog vremena sortirane po vremenu polaska.
Stavka Poeni
Čitanje argumenata 3
Prikaz celog rasporeda 2
Ispisivanje svih linija određenog polaznog mesta 3
Dodavanje linije 3
Ispisivanje svih linija nakon zadatog vremena 3
Suma 14

Rešenje

#!/bin/bash

busScheduler="/home/pos/busScheduler" # ovo je proizvoljno

opcije=":laf:b:"
while getopts $opcije opt; do
    case $opt in
        l) ispisiRaspored=1
            ;;
        a) dodajLiniju=1
            ;;
        f) nazivPolaznog=$OPTARG
            ;;
        b) vreme=$OPTARG
            ;;
        *) printf -- 'korišćenje:\n./skripta.sh -l -a -f polaznoVreme -b vreme\n'
            exit 1
            ;;
    esac
done

if [ ! $ispisiRaspored ]; then
    printf -- '-l je obavezna opcija\n'
    exit 2
fi

if [ ! $dodajLiniju ]; then
    printf -- '-a je obavezna opcija\n'
    exit 3
fi

if [ ! "$nazivPolaznog" ]; then
    printf -- '-f je obevezna opcija\n'
    exit 4
fi

if [ ! "$vreme" ]; then
    printf -- '-b je obavezna opcija\n'
    exit 5
fi

shift $(($OPTIND - 1))


# opcija -l
cat $busScheduler


# opcija -a
printf -- "unesi vreme: "
read unetoVreme
if [ -z "$(echo $unetoVreme | sed -n '/^[0-2][0-9]:[0-5][0-9]$/p')" ] || [ "$(echo $unetoVreme | sed -n '/^2[4-9]/p')" ]; then
    printf -- "pogrešno uneto vreme.\n"
    exit 6
fi

printf -- "unesi polazno mesto: "
read polaznoMesto

printf -- "unesi polazno vreme: "
read polaznoVreme

echo "$unetoVreme|$polaznoMesto|$polaznoVreme" >> $busScheduler


# opcija -f
grep "|$nazivPolaznog|" "$busScheduler"

    
# opcija -b
printf -- "unesi vreme: "
read unetoVreme
hhmm="$(echo $unetoVreme | sed -En 's/^([0-2][0-9]):([0-5][0-9])|.*$/\1\2/p')"

oldIFS="$IFS"
IFS=$'\n' 
for line in $(cat $busScheduler); do
    [ "$(echo $line | sed -En 's/^([0-2][0-9]):([0-5][0-9])|.*$/\1\2/p')" -gt $hhmm ] && echo $line
done | sort -n
IFS=$oldIFS