Sunteți pe pagina 1din 15

Ministerul Educaiei, Tineretului i Sportului al Republicii Moldova

Universitatea Tehnic a Moldovei


Facultatea Calculatoare, Informatic i Microelectronic
Catedra Calculatoare

RAPORT
Lucrare de laborator nr.4
Tema: Scripturi shell UNIX

Chiinu 2016

1. Modificai scriptul BunaZiua.sh redenumindu-l n BunaZiuaNume.sh dup cum urmeaz:


a) dac i transmitei doua argumente, primul coninnd numele iar al doilea prenumele, el
trebuie s le afieze dup salutare (de ex. Buna ziua, Nume Prenume)
b) dac nu-i transmitei nici un argument, el trebuie sa va afieze dup salutare numele de
conectare al utilizatorului (LOGNAME)
SOURCE CODE
#!/bin/bash
if [[ -z $1 && -z $2 ]];
then
echo "Buna Ziua $USER"
else
echo "Buna ziua $1 $2"
fi

2. Realizati un script shell UNIX care permite curarea ecranului iar apoi afieaz structura de fiiere
i directoare a directorului pe care l-a i furnizat ca argument. Indicaie : comanda care cur ecranul
este clear. Studiai pagina de manual a acestei comenzi !
SOURCE CODE
#!/bin/bash
# curatim ecranul
clear
# verificam daca a fost transmis un argument
if [[ -z $1 ]]; #daca este egal cu 0 atunci
then
#afisam structura completa a directoarelor utilizatorului curent
ls -R ~/
else
#daca este transmis argumentul atunci afisam structura completa in
baza argumentului
ls -R $1
fi
./ClearTree.sh ../Lab4/

3. Modificai scriptul precedent pentru a afia structura de fiiere i directoare a dosarului ./ClearTree.sh

4. Realizai un script shell UNIX care calculeaz suma primelor N numere naturale, N fiind argumentul
scriptului.
SOURCE CODE
#!/bin/bash
suma=0
contor=1
while [[ $contor -le $1 ]]; do
suma=$((suma+$contor))
contor=$(( contor+1 ))
done
echo $suma

5. Realizai un script shell UNIX care cere utilizatorului sa introduc doua iruri de caractere i apoi
afieaz un mesaj de informare dac cele doua iruri sunt sau nu egale. Mai exact, dac cele doua iruri
de caractere sunt egale se afieaz la terminal un mesaj de tipul Cele doua iruri de caracter sunt
egale, iar dac sunt diferite - un mesaj de tipul Cele doua iruri de caractere sunt diferite.
SOURCE CODE
#!/bin/bash
echo "Introduceti primul sir de caractere: "
read sir_1
echo "Introduceti al doilea sir de caractere: "
read sir_2
if [[ $sir_1 == $sir_2 ]]; then
echo "Cele doua iruri de caracter sunt egale"
else
echo "Cele doua iruri de caractere sunt diferite"
fi

6. Realizai un script care primete drept argument calea ctre un director, verifica dac acesta este un
director i n caz afirmativ afieaz coninutul acestuia i al subdirectoarelor.
SOURCE CODE
#!/bin/bash
if [[ -d $1 ]]; then
ls -R $1
fi

7. Realizai un script care permite copierea unui director specificat de ctre utilizator, cu ntreg
coninutul sau de fiiere i directoare ntr-un director numit copie.
SOURCE CODE
#!/bin/bash
sursa="$1"
destinatia="$1-copie"
mkdir $destinatia
cp -rvf "$sursa" "$destinatia"

8. Realizai un script shell UNIX care calculeaz suma primelor cinci numere pare, utiliznd un ciclu
while.
SOURCE CODE
#!/bin/bash
contor=1
index=1
while [[ $contor -le 5 ]]; do
if [[ $(($index%2)) -eq 0 ]]; then
echo "$contor - $index este numar par"
contor=$(($contor + 1))
fi
index=$(($index + 1))
done

9. Realizai un script care permite afiarea denumirii unei luni, n situaia n care utilizatorul specifica
numrul lunii. De exemplu pentru 3 afieaz martie.
SOURCE CODE
#!/bin/bash
Lunile_Anului=(ZERO Ianuarie Februarie Martie Aprilie
Iulie August Septembrie Octombrie Noiembrie Decembrie)
echo ${Lunile_Anului[$1]}

Mai

Iunie

10. Realizati un script shell UNIX care nu afieaz dect fiierele dintr-un anumit director furnizat ca
argument.
SOURCE CODE
#!/bin/bash
directory=$1;
find $1 -type f

11. Analog, creai un script shell UNIX care nu afieaz dect subdirectoarele dintr-un anumit director
furnizat ca argument.
SOURCE CODE
#!/bin/bash
directory=$1
find $1 -type d

12. Realizai un script shell UNIX care permite afiarea numrului de fiiere i de subdirectoare dintrun director furnizat drept argument (verificai pentru nceput dac directorul exista). Se vor lua n
considerare doua cazuri :
a) cutare superficiala (va limitai doar la directorul curent fr a va preocupa de subdirectoare);
b) cutare n profunzime (cutare n toate sub-directoarele din dosarul de baza)
SOURCE CODE
#!/bin/bash
# directorul furnizat ca argument
directory=$1;
# verificam daca argumentul a fost transmis + daca este director
if [[ ! -z $directory && -d $directory ]];
then
# afisam un mic menu pentru a alege tipul de cautare conform
conditiei
echo "Tipul de cautare"
echo "================"
echo "a) cutare superficiala"
echo "b) cutare n profunzime"
# citim de la tastatura optiunea aleasa
read TipCautare
# folosim instructiunea CASE pentru fiecare scenariu ales de
$USER
case $TipCautare in
a )
# scenariul pentru cautarea superficiala
echo "Start cutare superficiala"
ls -1 $directory | wc -l
;;
b )
# scenariul pentru cautarea in profunzime

fi

esac

;;

echo "Start cutare n profunzime"


ls -R1 $directory | wc -l

13. Scriei un script care afieaz numrul de utilizatori conectai i numrul de procese lansate n
momentul lansrii scriptului.
SOURCE CODE
#!/bin/bash
NumbersOfUsers=$(ps -eaho user | sort -u | wc -l)
echo "Numarul de utilizatori: $NumbersOfUsers"
ps -eaho user | sort -u
echo "Numarul de procese lansate la moment: "
ps ax | wc -l | tr -d " "

14. Scriei un script care afieaz numerele de la 1 pn la valoarea N transmisa scriptului n calitate de
parametru:
a) Folosii n acest scop o bucl while do done
SOURCE CODE
#!/bin/bash
N=$1
contor=1
while [[ $contor -le $N ]]; do
echo $contor
contor=$(( contor+1 ))
done

b) Rescriei script-ul folosind structura until do done.


SOURCE CODE
#!/bin/bash
N=$1
contor=1
until [[ $contor -gt $N ]]; do
echo $contor
contor=$(($contor+1))
done

c) Schimbai script-ul pentru a calcula media tuturor valorilor afiate anterior.


SOURCE CODE
#!/bin/bash
N=$1
contor=1
media=0
until [[ $contor -gt $N ]]; do
media=$(($media+$contor))

contor=$(($contor+1))
done
media=$(($media/($contor-1)))
echo "Media = $media"

15. Realizai un script shell UNIX care realizeaz un meniu afiat n bucla care permite urmtoarele
opiuni :
a) pentru opiunea 1 afieaz un mesaj de ntmpinare ;
b) pentru opiunea 2 afieaz data curenta;
c) pentru opiunea 3 afieaz procesele care ruleaz la acel moment (comanda ps);
d) pentru opiunea 4 va ntreab numrul procesului care trebuie oprit ("ucide" procesul trimindu-i
semnalul SIGKILL);
e) pentru opiunea 5 cura ecranul;
f) pentru opiunea 6 prsete scriptul;
SOURCE CODE
#!/bin/bash
while :
do
echo "---------------------------------"
echo "
M E N U"
echo "---------------------------------"
echo "1. afieaz un mesaj de ntmpinare"
echo "2. afieaz data curenta"
echo "3. afieaz procesele care ruleaz la acest moment"
echo "4. Kill Proces"
echo "5. Curata ecran"
echo "6. Iesire"
echo "---------------------------------"
read -r -p "Enter your choice [1-6] : " c
case $c in
1) echo "Mesaj de intimpinare pentru $USER";;
2) date;;
3) echo '*** Top 10 Procese care consuma Memorie:'; ps -auxf | sort
-nr -k 4 | head -10;
echo; echo '*** Top 10 Procese care consuma CPU:';ps -auxf | sort
-nr -k 3 | head -10;
echo; ;;
4) read -r -p "Numarul procesului de UCIS: " P ; kill -9 $P;;
5) clear;;
6) exit;;
*) "Select between 1 to 6 only"
esac
done

16. Implementai conceptul Recycle Bin n linie de comanda n felul urmtor:


in momentul cnd tergei un fiier sau un dosar (instruciunea rm) el va fi copiat (i nu ters) n
dosarul ~/RecycleBin care se afla n repertorul personal.
Un alt script se lanseaz la conectarea utilizatorului. El va anun ca n dosarul respectiv
(~/RecycleBin) se afla N fiiere i volumul ocupat de ele i v ndeamn sa le examinai i sa le tergei
definitiv pe cele de care nu mai avei nevoie. Dac acceptai examinarea dosarului scriptul v propune
s tergei unul cte unul toate fiierele iar dup examinarea ultimului dintre ele va afieaz volumul
fiierelor ramase i se nchide. Dac nu acceptai atunci scriptul se nchide
SOURCE CODE
#!/bin/bash
# generam directorul Recycle Bin daca nu exista
mkdir -p "/home/$USER/Recycle_Bin/"
# setam ca destinatie directorul Recycle Bin
fisierele in el
DESTINATIE="/home/$USER/Recycle_Bin/"

pentru

copia

# functie pentru afisarea datelor statistice despre Recycle_Bin


# avem nevoie de functie deoarece o folosim >=2 ori
statistic()
{
# calculam si afisam spatiul din DESTINATIE
echo "Spatiu Ocupat $(du -sh $DESTINATIE)"
# calculam si afisam numarul de elemente din DESTINATIE
echo "Nr de fisiere $(ls -R1 $DESTINATIE | wc -l)"
}
# apelam functia statistic pentru marime si numarul fisierelor
statistic
# realizam curatarea fisierelor din Recycle_Bin la inceput de
sesiune
read -r -p "Doriti sa stergeti fisiere ? [Y/N] : " raspuns
case $raspuns in
y) rm -vir $DESTINATIE ; statistic ;;
n) echo "O zi buna in continuare, multumesc pentur atentie";;
esac
# Facem "alias" pentru instructiunea "rm" ca ea sa copie fisierul in
loc sa-l stearga
alias rm="cp -rf $1 $DESTINATIE"

Remarca: Acest script indeplineste ambele sarcini, el inlocuieste instructiunea rm cu instructiunea cp


iar la inceputul sesiunii arata marimea si nr. de fisiere din Recycle Bin iar daca el nu-i atunci il
genereaza, dupa care intreba USER-ul daca doreste s stearga fisierele unul cite unul. Pentru ca scriptul
sa lucreze din startul sesiunii este nevoie sa-l includem in fisierul ~/.xinitrc
Exemplu:
FISIERUL ~/.xinitrc
#!/bin/sh
#~/.xinitrc
if [ -d /etc/X11/xinit/xinitrc.d ] ; then
for f in /etc/X11/xinit/xinitrc.d/* ; do
[ -x "$f" ] && . "$f"
done
unset f
fi
./Desktop/16\ -\ Recycle\ Bin.sh

S-ar putea să vă placă și