Sunteți pe pagina 1din 14

Universitatea Tehnică a Moldovei

Facultatea Calculatoare, Informatică și Microelectronică


Departamentul Informatică și Ingineria Sistemelor

Lucrare de laborator №5
Programare de sistem
Tema: Script-uri shell UNIX

A realizat: st. gr. MAI-211M, Iulian


Cernei
A verificat: conf. univ., Victor
Moraru
Chișinău, 2021
Scopul lucrării
Familiarizarea cu procedurile de scriere și rulare a script-urilor shell-urilor Unix.
Mersul lucrării
Primul script ”Hello World”
BunaZiua.sh:
#!/usr/bin/bash

Echo Buna ziua !

Figura 1, prezintă rezultatul executării script-ului BunaZiua.sh.

Figura 1. Execuția script-ului BunaZiua.sh


Script-uri simple
1. Afișarea parametrilor
params.sh:
#!/usr/bin/bash

if [ $# -eq 0 ];
then
echo Nici un argument transmis
else
echo Au fost trimise $# argumente:
for x
do
echo $x
done
fi

Figura 2, prezintă rezultatul execuției script-ului params.sh.

Figura 2 Execuția script-ului params.sh


params1.sh:
#!/usr/bin/bash

if [ $# -eq 0 ];
then
echo Nici un argument transmis
else
echo Au fost trimise $# argumente:
for (( i=$#; $i>0; i=$i-1 ))
do
echo "${!i}"
done
fi

Figura 3, prezintă rezultatul execuției script-ului params1.sh, care afișează argumentele în ordine
inversă.

Figura 3. Execuția script-ului params1.sh


2. Analiza script-ului
Script-ul ((test $1 -lt $2) && (echo '$1 < $2')) || (echo '$2 < $1'), returnează șirul de caractere '$1
< $2', în cazul când expresia $1 -lt $2 este adevărată, și șirul de caractere '$2 < $1', în caz contrar. În
expresia $1 -lt $2, se verifică dacă primul argument trimis script-ului este mai mic decât al doilea.
Altfel, script-ul ((test $1 -lt $2) && (echo '$1 < $2')) || (echo '$2 < $1'), reprezintă forma prescurtată
a instrucțiunii if, așa cum este prezentă și în alte limbaje de programare.
explain.sh:
#!/usr/bin/bash

((test $1 -lt $2) && (echo '$1 < $2')) || (echo '$2 < $1')

Figura 4, prezintă rezultatul execuției script-ului explain.sh.

Figura 4. Execuția script-ului explain.sh


În fișierul explain1.sh, ghilimelele simple au fost înlocuite cu ghilimelele duble. Ca rezultat,
este returnat șirul de caractere în care $1 și $2 sunt înlocuite cu valorile acestora. Acest lucru a fost
posibil, deoarece ghilimelele duble permit utilizarea variabilelor și comenzilor.
explain1.sh:
#!/usr/bin/bash

((test $1 -lt $2) && (echo "$1 < $2")) || (echo "$2 < $1")

Figura 5, prezintă rezultatul execuției script-ului explain1.sh.

Figura 5. Execuția script-ului explain1.sh


Figura 6, prezintă codul returnat după executarea script-ului explain1.sh.
Figura 6. Afișarea codului la sfârșit de execuție
După execuția script-ului este returnat codul 0. Aceasta înseamnă că script-ul s-a executat cu
succes.
În fișierul explain2.sh, script-ul ((test $1 -lt $2) && (echo '$1 < $2')) || (echo '$2 < $1') a fost
rescris conform structurii if then else fi. Rezultatul execuției este prezentat în figura 7.
explain2.sh:
#!/usr/bin/bash

if [ $1 -lt $2 ];
then
echo "$1 < $2"
else
echo "$2 < $1"
fi

Figura 7. Execuția script-ului explain2.sh


3. Afișarea PID-ului
Script-ul pidshow.sh afișează în terminal identificatorul procesului.
pidshow.sh:
#!/usr/bin/bash

echo PID-ul meu este $$

Figura 8, prezintă rezultatul execuției script-ului pidshow.sh.

Figura 8. Execuția script-ului pidshow.sh


La fiecare apelare a script-ului indentificarea procesului este diferit. Consider că acest lucru
este bine, deoarece ușor poate terminat un anumit proces, fără a fi confundat cu altul.
Exerciții
1. Modificarea script-ului BunaZiua.sh în BunaZiuaNume.sh
BunaZiuaNume.sh:
#!/usr/bin/bash

if [ $# -eq 0 ];
then
echo Buna ziua, `whoami`!
elif [ $# -eq 2 ];
then
echo Buna ziua, $1 $2!
fi

Figura 9, prezintă rezultatul execuției script-ului BunaZiuaNume.sh.

Figura 9. Execuția script-ului BunaZiuaNume.sh


2. Structura de fișiere
filestruct.sh:
#!/usr/bin/bash

clear
if [ $# -eq 0 ];
then
tree $HOME
elif [ $# -eq 1 ];
then
tree $1
fi
Figura 10 și figura 11, prezintă rezultatul execuției script-ului filestruct.sh.

Figura 10. Execuția script-ului filestruct.sh /home/iulian/Lab4

Figura 11. Execuția script-ului filestruct.sh


3. Compararea șirurilor de caractere
strcmp.sh:
#!/usr/bin/bash

echo -n "Introdu primul sir de caractere: "


read str1
echo -n "Introdu al doilea sir de caractere: "
read str2
if [ "$str1" = "$str2" ];
then
echo "Cele doua siruri de caractere sunt egale!"
else
echo "Cele doua siruri de caractere sunt diferite!"
fi

Figura 12, prezintă rezultatul execuției script-ului strcmp.sh.

Figura 12. Execuția script-ului strcmp.sh


4. Conținutul dosarului
dirfiles.sh:
#!/usr/bin/bash

if [ $# -eq 1 ];
then
if [ -d $1 ];
then
ls -R "$1"
fi
fi

Figura 13, prezintă rezultatul execuției script-ului dirfiles.sh.

Figura 13. Execuția script-ului dirfiles.sh


5. Copierea unui dosar
copydir.sh:
#!/usr/bin/bash

if [ $# -eq 1 ];
then
if [ -e $1 ];
then
if ! [[ -e copie ]];
then
mkdir copie
fi
file=`basename $1`
cp -Rv $1 copie/$file
else
echo "Dosarul indicat nu exista!"
fi
fi

Figura 14, prezintă rezultatul execuției script-ului copydir.sh.

Figura 14. Execuția script-ului copydir.sh


6. Suma numerelor pare
sumnum.sh:
#!/usr/bin/bash

let sum=0; let i=0


while [ $i -lt 5 ];
do
let "sum = $sum + 10 + 2 * $i"
let "i = $i + 1"
done
echo "Suma primelor 5 numere pare este: $sum"

Figura 15, prezintă rezultatul execuției script-ului sumnum.sh.

Figura 15. Execuția script-ului sumnum.sh


7. Convertirea număr -> lună
month.sh:
#!/usr/bin/bash

echo -n "Introdu numarul lunii: "


read month

case $month in
1) echo ianuarie;;
2) echo februarie;;
3) echo martie;;
4) echo aprilie;;
5) echo mai;;
6) echo iunie;;
7) echo iulie;;
8) echo august;;
9) echo septembrie;;
10) echo octombrie;;
11) echo noiembrie;;
12) echo decembrie;;
*) echo Nu exista asa luna;;
esac

Figura 16, prezintă rezultatul execuției script-ului month.sh.

Figura 16. Execuția script-ului month.sh


8. Afișarea subdirectoare
subdir.sh:
#!/usr/bin/bash

if [ $# -eq 1 ];
then
ls -l $1 | grep ^d | awk '{print $9}'
fi

Figura 17, prezintă rezultatul execuției script-ului subdir.sh.

Figura 17. Execuția script-ului subdir.sh


9. Numărarea fișierelor
filecount.sh:
#!/usr/bin/bash

if [ $# -eq 1 ];
then
if [ -e $1 ];
then
echo -n 'Doriti o cautare superficiala?(y/n): '
read answer
if [ $answer = y ];
then
dosar=`ls -l $1 | grep ^d | awk '{print $9}' | wc -l`
fisier=`ls -1Up $1 | grep -v / | wc -l`
echo "Dosare: $dosar, Fisiere: $fisier"
elif [ $answer = n ];
then
dosar=`find $1 -type d | wc -l`
fisier=`find $1 -type f | wc -l`
echo "Dosare: $dosar, Fisiere: $fisier"
fi
fi
fi

Figura 18, prezintă rezultatul execuției script-ului filecount.sh.

Figura 18. Execuția script-ului filecount.sh


10. Afișare un șir de numere
sirwhile.sh:
#!/usr/bin/bash

if [ $# -eq 1 ];
then
if [ -n "$1" ] && [ "$1" -eq "$1" ] 2>/dev/null;
then
let i=1
while [ $i -le $1 ];
do
echo -n "$i "
let "i = $i + 1"
done
echo
fi
fi

Figura 19, prezintă rezultatul execuției script-ului sirwhile.sh.

Figura 19. Execuția script-ului sirwhile.sh


siruntil.sh:
#!/usr/bin/bash

if [ $# -eq 1 ];
then
if [ -n "$1" ] && [ "$1" -eq "$1" ] 2>/dev/null;
then
let i=1
until [ $i -gt $1 ];
do
echo -n "$i "
let "i = $i + 1"
done
echo
fi
fi
Figura 20, prezintă rezultatul execuției script-ului siruntil.sh.

Figura 20. Execuția script-ului siruntil.sh


siruntil1.sh:
#!/usr/bin/bash

let sum=0
if [ $# -eq 1 ];
then
if [ -n "$1" ] && [ "$1" -eq "$1" ] 2>/dev/null;
then
let i=1
until [ $i -gt $1 ];
do
echo -n "$i "
let "sum = $sum + $i"
let "i = $i + 1"
done
echo -n " Media: $(($sum / $1))"
echo
fi
fi

Figura 21, prezintă rezultatul execuției script-ului siruntil1.sh.

Figura 21. Execuția script-ului siruntil1.sh


11. Memoria dosarelor
dirmem.sh:
#!/usr/bin/bash

echo -n "Introdu calea spre un dosar: "


read path

if [ -z $path ];
then
pathSize=`du -sh $HOME | awk '{print $1}'`
echo "$HOME ocupa $pathSize memorie"
echo
du -h --max-depth=1 $HOME | sort -rh | tail -n +2
elif [ -e $path ];
then
pathSize=`du -sh $path | awk '{print $1}'`
echo "$path ocupa $pathSize memorie"
echo
du -h --max-depth=1 $path | sort -rh | tail -n +2
fi

Figura 22, prezintă rezultatul execuției script-ului dirmem.sh. Cazul în care nu se trimite nici un
nume de dosar.

Figura 22. Execuția script-ului dirmem.sh


În continuare, se prezintă execuția script-ului dirmem.sh, sub formă de text, în cazul când
nume de dosar este trimis /var.
iulian@cernei:~/Lab4$ bash dirmem.sh
Introdu calea spre un dosar: /var
du: cannot read directory '/var/tmp/systemd-private-
3392263f5e0847d79512a6ad8b5a7880-systemd-logind.service-ia5mXh': Permission
denied
du: cannot read directory '/var/tmp/systemd-private-
3392263f5e0847d79512a6ad8b5a7880-apache2.service-YsIoPi': Permission denied
du: cannot read directory '/var/tmp/systemd-private-
3392263f5e0847d79512a6ad8b5a7880-systemd-timesyncd.service-rpJPdj': Permission
denied
du: cannot read directory '/var/log/private': Permission denied
du: cannot read directory '/var/log/apache2': Permission denied
du: cannot read directory '/var/spool/rsyslog': Permission denied
du: cannot read directory '/var/spool/cron/crontabs': Permission denied
du: cannot read directory '/var/cache/apparmor/c08a2770.0': Permission denied
du: cannot read directory '/var/cache/private': Permission denied
du: cannot read directory '/var/cache/ldconfig': Permission denied
du: cannot read directory '/var/cache/apt/archives/partial': Permission denied
du: cannot read directory '/var/lib/private': Permission denied
du: cannot read directory '/var/lib/apt/lists/partial': Permission denied
/var ocupa 242M memorie

du: cannot read directory '/var/tmp/systemd-private-


3392263f5e0847d79512a6ad8b5a7880-systemd-logind.service-ia5mXh': Permission
denied
du: cannot read directory '/var/tmp/systemd-private-
3392263f5e0847d79512a6ad8b5a7880-apache2.service-YsIoPi': Permission denied
du: cannot read directory '/var/tmp/systemd-private-
3392263f5e0847d79512a6ad8b5a7880-systemd-timesyncd.service-rpJPdj': Permission
denied
du: cannot read directory '/var/log/private': Permission denied
du: cannot read directory '/var/log/apache2': Permission denied
du: cannot read directory '/var/spool/rsyslog': Permission denied
du: cannot read directory '/var/spool/cron/crontabs': Permission denied
du: cannot read directory '/var/cache/apparmor/c08a2770.0': Permission denied
du: cannot read directory '/var/cache/private': Permission denied
du: cannot read directory '/var/cache/ldconfig': Permission denied
du: cannot read directory '/var/cache/apt/archives/partial': Permission denied
du: cannot read directory '/var/lib/private': Permission denied
du: cannot read directory '/var/lib/apt/lists/partial': Permission denied
95M /var/lib
74M /var/log
74M /var/cache
412K /var/backups
32K /var/spool
20K /var/www
16K /var/tmp
4.0K /var/opt
4.0K /var/mail
4.0K /var/local

Concluzii
În această lucrare de laborator am avut ca scop familiarizarea cu procedurile de scriere și
rulare a script-urilor shell-urilor Unix. Astfel, am realizat o multitudine de sarcini care sunt realizate
prin script-uri.
În procesul realizării acestei lucrări mi-am aprofundat cunoștințele în scrierea și executarea
script-urilor în Unix. Am înțeles mult mai bine modalitățile de scriere a instrucțiunilor if, while,
until, case. De asemenea, am utilizat informații luate de la utilizator în momentul execuției script-
ului și am efectuat operații matematice, care diferă în comparație cu alte limbaje.