ПОС/Лаб 3 2020

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Лаб 3 се појављује у четвртом термину вежби.

Група 3

Задатак 1

Поставка

Написати скрипту која обрађује распоред аутобуских линија који се налази у фајлу busScheduler. Сваки ред је једна линија по формату време_поласка|полазно_место|долазно_место. Унутар скрипте поставити путању до фајла busScheduler. Скрипта прима следеће опције, уколико бар једна није наведена пријавити грешку:

Опција -l без параметра исписује цео распоред аутобуских линија.
Опција -f са параметром који представља назив полазног места. Ова опција треба да испише само линије чије је полазно место прослеђено.
Опција -a без параметра додаје нову линију на крај фајла busScheduler. Ако је наведана[sic] ова опција скрипта треба да обезбеди кориснику унос времена, полазног и долазног места. Потребно је проверити исправност унетог времена, оно мора бити у 24-часовном формату hh:MM. Уколико није треба пријавити грешку кориснику и прекинути скрипту.
Опција -b са параметром који представља време у формат hh:MM. Ова опција треба да испише све линије које полазе након задатог времена сортиране по времену поласка.
Ставка Поени
Читање аргумената 3
Приказ целог распореда 2
Исписивање свих линија одређеног полазног места 3
Додавање линије 3
Исписивање свих линија након задатог времена 5
Сума 14

Лаб 3 се појављује у четвртом термину вежби.

Група 3

Задатак 1

Поставка

Написати скрипту која обрађује распоред аутобуских линија који се налази у фајлу busScheduler. Сваки ред је једна линија по формату време_поласка|полазно_место|долазно_место. Унутар скрипте поставити путању до фајла busScheduler. Скрипта прима следеће опције, уколико бар једна није наведена пријавити грешку:

Опција -l без параметра исписује цео распоред аутобуских линија.
Опција -f са параметром који представља назив полазног места. Ова опција треба да испише само линије чије је полазно место прослеђено.
Опција -a без параметра додаје нову линију на крај фајла busScheduler. Ако је наведана[sic] ова опција скрипта треба да обезбеди кориснику унос времена, полазног и долазног места. Потребно је проверити исправност унетог времена, оно мора бити у 24-часовном формату hh:MM. Уколико није треба пријавити грешку кориснику и прекинути скрипту.
Опција -b са параметром који представља време у формат hh:MM. Ова опција треба да испише све линије које полазе након задатог времена сортиране по времену поласка.
Ставка Поени
Читање аргумената 3
Приказ целог распореда 2
Исписивање свих линија одређеног полазног места 3
Додавање линије 3
Исписивање свих линија након задатог времена 5
Сума 14

Решење

#!/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

"$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