POS/Lab 3 2020
< ПОС
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