ПОС/Лаб 2 2016 — разлика између измена
м (+bolje rešenje) |
м (+data-solutions) |
||
| (Нису приказане 2 међуизмене 2 корисника) | |||
| Ред 1: | Ред 1: | ||
{{tocright}} | {{tocright}} | ||
Лаб 2 се појављује у '''трећем''' термину вежби. | Лаб 2 се појављује у '''трећем''' термину вежби. | ||
{{решења}} | |||
== Група 3c == | == Група 3c == | ||
| Ред 9: | Ред 9: | ||
==== Решење ==== | ==== Решење ==== | ||
<syntaxhighlight lang="bash" class="spoiler"> | <syntaxhighlight lang="bash" class="spoiler" data-solution="plain"> | ||
while getopts :q:g opt | while getopts :q:g opt | ||
do | do | ||
| Ред 27: | Ред 27: | ||
==== Решење ==== | ==== Решење ==== | ||
<syntaxhighlight lang="bash" class="spoiler"> | <syntaxhighlight lang="bash" class="spoiler" data-solution="plain"> | ||
#!/bin/sh | #!/bin/sh | ||
[ -z $PATH ] && export PATH="/home/pos" || export PATH="$PATH:/home/pos" | [ -z $PATH ] && export PATH="/home/pos" || export PATH="$PATH:/home/pos" | ||
| Ред 37: | Ред 37: | ||
==== Решење ==== | ==== Решење ==== | ||
<syntaxhighlight lang="bash" class="spoiler"> | <syntaxhighlight lang="bash" class="spoiler" data-solution="plain"> | ||
#!/bin/sh | #!/bin/sh | ||
comm -12 <(ls -a /etc/skel) <(ls -a /home/pos) | comm -12 <(ls -a /etc/skel) <(ls -a /home/pos) | ||
| Ред 48: | Ред 48: | ||
==== Решење ==== | ==== Решење ==== | ||
<syntaxhighlight lang="bash" class="spoiler"> | <syntaxhighlight lang="bash" class="spoiler" data-solution="plain"> | ||
sed '/football/ s/$/GOOOL/' file | sed '/football/ s/$/GOOOL/' file | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| Ред 59: | Ред 59: | ||
==== Решење ==== | ==== Решење ==== | ||
<syntaxhighlight lang="bash" class="spoiler"> | <syntaxhighlight lang="bash" class="spoiler" data-solution="plain"> | ||
# pretpostavka da je već izvršeno sudo su | # pretpostavka da je već izvršeno sudo su | ||
export VISUAL=emacs | export VISUAL=emacs | ||
| Ред 72: | Ред 72: | ||
==== Решење ==== | ==== Решење ==== | ||
<syntaxhighlight lang="bash" class="spoiler"> | <syntaxhighlight lang="bash" class="spoiler" data-solution="plain"> | ||
#!/bin/sh | #!/bin/sh | ||
for i in $(echo $PATH | tr ':' ' '); do | for i in $(echo $PATH | tr ':' ' '); do | ||
| Ред 86: | Ред 86: | ||
==== Решење ==== | ==== Решење ==== | ||
<syntaxhighlight lang="bash" class="spoiler"> | <syntaxhighlight lang="bash" class="spoiler" data-solution="plain"> | ||
sed -E 's|\w\w([0-9]{2})([0-9]{4})\w|20\1/\2|' file | sed -E 's|\w\w([0-9]{2})([0-9]{4})\w|20\1/\2|' file | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| Ред 97: | Ред 97: | ||
==== Решење ==== | ==== Решење ==== | ||
<syntaxhighlight lang="bash" class="spoiler"> | <syntaxhighlight lang="bash" class="spoiler" data-solution="plain"> | ||
#!/bin/sh | #!/bin/sh | ||
expr `radi1.sh` + `radi2.sh` | expr `radi1.sh` + `radi2.sh` | ||
| Ред 104: | Ред 104: | ||
Друго решење: | Друго решење: | ||
<syntaxhighlight lang="bash" class="spoiler"> | <syntaxhighlight lang="bash" class="spoiler" data-solution="plain"> | ||
#!/bin/sh | #!/bin/sh | ||
echo $((`radi1.sh` + `radi2.sh`)) | echo $((`radi1.sh` + `radi2.sh`)) | ||
| Ред 116: | Ред 116: | ||
==== Решење ==== | ==== Решење ==== | ||
<syntaxhighlight lang="bash" class="spoiler"> | <syntaxhighlight lang="bash" class="spoiler" data-solution="plain"> | ||
#!/bin/sh | #!/bin/sh | ||
dubina=2 | dubina=2 | ||
| Ред 133: | Ред 133: | ||
==== Решење ==== | ==== Решење ==== | ||
<syntaxhighlight lang="bash" class="spoiler"> | <syntaxhighlight lang="bash" class="spoiler" data-solution="plain"> | ||
ip=15.10.10.15 | ip=15.10.10.15 | ||
echo $ip | | echo $ip | | ||
| Ред 144: | Ред 144: | ||
==== Решење ==== | ==== Решење ==== | ||
<syntaxhighlight lang="bash" class="spoiler"> | <syntaxhighlight lang="bash" class="spoiler" data-solution="plain"> | ||
#!/bin/sh | #!/bin/sh | ||
[ `whoami` = 'pos' ] && radi.sh | [ `whoami` = 'pos' ] && radi.sh | ||
| Ред 151: | Ред 151: | ||
Друго решење: | Друго решење: | ||
<syntaxhighlight lang="bash" class="spoiler"> | <syntaxhighlight lang="bash" class="spoiler" data-solution="plain"> | ||
#!/bin/sh | #!/bin/sh | ||
[ "$USER" = 'pos' ] && radi.sh | [ "$USER" = 'pos' ] && radi.sh | ||
| Ред 163: | Ред 163: | ||
==== Решење ==== | ==== Решење ==== | ||
<syntaxhighlight lang="bash" class="spoiler"> | <syntaxhighlight lang="bash" class="spoiler" data-solution="plain"> | ||
#!/bin/ | #!/bin/bash | ||
find /usr -maxdepth 1 -executable | | |||
velicina=0 | |||
for i in $(find /usr -maxdepth 1 -executable | sudo du -s {}\;); do | |||
velicina=$(( $velicina + $i )) | |||
done | |||
echo $velicina | |||
</syntaxhighlight> | </syntaxhighlight> | ||
[[Категорија:ПОС]] | [[Категорија:ПОС]] | ||
[[Категорија:Лабораторијске вежбе]] | [[Категорија:Лабораторијске вежбе]] | ||
Тренутна верзија на датум 30. јун 2021. у 15:33
Лаб 2 се појављује у трећем термину вежби.
- За питања са више одговора, тачни одговори су подебљани и уоквирени
- За питања за које се одговори уносе, тачни одговори су подвучени и сакривени, тако да се прикажу када изаберете тај текст (пример: овако)
- Притисните лево дугме испод за сакривање и откривање свих одговора, или десно дугме за укључивање и искључивање интерактивног режима:
Група 3c
Задатак 1
Поставка
(3п) Дати команду која у скрипти поставља аргументе. Аргументе које поставља су одвојене опције и позициони параметри. Од опција у скрипти се очекују q и g, где q има параметар.
Решење
while getopts :q:g opt
do
case $opt in
q) ;;
g) ;;
*) echo 'Usage: script [-q parameter] [-g] '
exit -1
;;
esac
done
Задатак 2
Поставка
(4п) Написати команде које ће омогућити да скрипта skripta.sh у директоријуму /home/pos покреће само навођењем њеног имена без навођења апсолутне путање или директоријума.
Решење
#!/bin/sh
[ -z $PATH ] && export PATH="/home/pos" || export PATH="$PATH:/home/pos"
Задатак 3
Поставка
(7п) Написати скрипту која исписује колико фајлова са истим називом постоји у директоријумима /etc/skel и /home/pos. Разматрати и скривене фајлове.
Решење
#!/bin/sh
comm -12 <(ls -a /etc/skel) <(ls -a /home/pos)
Група 4
Задатак 1
Поставка
(3п) Написати команду sed која убацује линију текста GOOOL након сваке линије која садржи реч football.
Решење
sed '/football/ s/$/GOOOL/' file
Усвојена претпоставка да се чита из фајла file.
Задатак 2
Поставка
(4п) За потребе овог задатка извршити промену корисника у root. То се ради помоћу команде sudo su и уношењем шифре student. Написати команде које су потребне да би команда visudo отворила едитор emacs. Команда visudo ће отворити едитор који се налази у променљивој VISUAL. Ако је та променљива празна отвориће је у подразумеваном едитору (сматрати да подразумеван едитор није emacs). За промену корисника у стандардног корисника извршити команду exit.
Решење
# pretpostavka da je već izvršeno sudo su
export VISUAL=emacs
alias visudo='[ -z $VISUAL ] && $EDITOR || $VISUAL'
Условљена претпоставка да је $EDITOR подразумевани едитор.
Задатак 3
Поставка
(7п) Написати скрипту која проналази директоријум из листе у променљивој PATH који садржи највећи број фајлова и директоријума. Скрипта треба да испише име пронађеног директоријума.
Решење
#!/bin/sh
for i in $(echo $PATH | tr ':' ' '); do
ls $i | wc -l | tr -d '\n'
echo " $i"
done | sort -nr | head -1 | cut -d' ' -f2
Група 5
Задатак 1
Поставка
(3п) Написати команду sed која мења студентски налог са бројем индекса. Нпр. aa000001d мења се 2000/0001. Година уписа је већа или једнака 2000.
Решење
sed -E 's|\w\w([0-9]{2})([0-9]{4})\w|20\1/\2|' file
Усвојена претпоставка да се чита из фајла file.
Задатак 2
Поставка
(4п) Написати скрипту која покреће две скрипте и сабира њихове повратне вредности. Имена скрипти су radi1.sh и radi2.sh. Збир исписује као резултат.
Решење
#!/bin/sh
expr `radi1.sh` + `radi2.sh`
Друго решење:
#!/bin/sh
echo $((`radi1.sh` + `radi2.sh`))
Условљена претпоставка да се скрипте radi1.sh и radi2.sh налазе у PATH-у, те да није потребна апсолутна путања за њихово извршавање.
Задатак 3
Поставка
(7п) Написати скрипту која свим фајловима са екстензијом .conf у директоријуму /home/pos уклања права за упис. Фајлови се претражују до произвољне дубине директоријума.
Решење
#!/bin/sh
dubina=2
find /home/pos/ -maxdepth $dubina -name "*.conf" | xargs chmod -w
# bolje rešenje
find /home/pos/ -maxdepth $dubina -name "*.conf" -exec chmod -w +
Дубина је одређена променљивом "dubina".
Група 6
Задатак 1
Поставка
(3п) Написати команду sed која мења IP адресу тако што други број у њој замени са xx. Нпр. 15.10.10.15 мења са 15.xx.10.15.
Решење
ip=15.10.10.15
echo $ip |
sed 's/\([0-9]\+\.\)[0-9]\+\./\1xx./'
Задатак 2
Поставка
(4п) Написати скрипту, која позива скрипту radi.sh, само ако је покрене корисник pos.
Решење
#!/bin/sh
[ `whoami` = 'pos' ] && radi.sh
Друго решење:
#!/bin/sh
[ "$USER" = 'pos' ] && radi.sh
Условљена претпоставка да се скрипта radi.sh налази у PATH-у, те да није потребна апсолутна путања за њено извршавање.
Задатак 3
Поставка
(7п) Написати скрипту која проналази све извршиве фајлове у директоријуму /usr и рачуна њихову укупну величину. Скрипта треба да испише израчунату величину у бајтовима/карактерима.
Решење
#!/bin/bash
velicina=0
for i in $(find /usr -maxdepth 1 -executable | sudo du -s {}\;); do
velicina=$(( $velicina + $i ))
done
echo $velicina