Sunteți pe pagina 1din 15

De lucrat la laboratoare Calc ptr sapt 2-3 (11-15 si 18-22 oct)

De citit Referat de laborator 1

1.Organizarea fisierelor sub Linux


Navigare in arborele de directoare cu ajutorul unui explorer grafic
Navigare in arborele de directoare cu ajutorul comenzilor.

Exemple:
Comanda localizare : pwd
Comanda deplasare: cd
Director curent, ditector propriu, director parinte

2. Numele fisierelor sub Linux


Specificatorul de fisier: /cale/nume.extensie
Referintele . si .. din directorul curent

Exemple:
Fisiere cu nume, nume.extensie, .extensie
Fisiere vizibile, fisiere "ascunse"

3. Vizualizarea fisierelor sub Linux - informatii despre fisiere


Afisarea fisierelor dintr-un director.

Exemple:
ls cu diverse optiuni
-l si semnificatia celor afisate discuta in detaliu
ls -d -a, -A, -R … samd
ls si argumente cu expresii generice (*, ? , interval, lista)
Intrebari:
Sa se afiseze toate fisierele de 4 litere care se termina cu cifra din /bin
Sa se afiseze toate fisierele din /home care incep cu litera a si se termina cu 3 cifre, etc

4. Metacaractere - utilizare si invalidare


Afisarea metacaractere *, ? cu echo.
Invalidare (citare) cu $ ", '

Exemple:
vezi exempele din Cursul in PowerPoint de pe edu.csed

1
5. Vizualirea fisierelor sub Linux - continutul fisierelor
Tipuri de fisiere : text, binare . Comanda file
Comenzi de vizualizare continut fisiere text
Comenzi vizualizare continut fisiere binare

Exemple:
Afisare cu ls -l | more fisiere din /dev pentru vizualizare tipuri
cat, more, less
hexdump si altele

6. Manipularea fisierelor sub Linux


Comenzi pentru creare fisiere.
Crearea fisierelor text.
Comenzi pentru creare si stergere directoare

Exemple:
touch, cp - editoare - rm - mv
mkdir rmdir, rm

2
De lucrat la laboratoare ptr sapt 4-5 (25-29 oct si 1-5 nov)

1. Redirectarea comenzilor
Fisierele flux: iesire (STDOUT), eroare (STDERR), intrare (STDIN)
Descriptorii de fisier numerici: 1, 2, 0

Exemple (1):
Comenzi listare (ls, cat, date, cal, w, who, etc) redirectate catre fisier: 1>fisier , 1>>fisier
Comenzi eronate cu redirectare eroare catre fisier 2>fisier , 2>> fisier
Comenzi eronate cu redirectare mesaj de eroare catre /dev/null
Comenzi cu intrarea redirectata:
a) se creaza fisierul text1 continand cuvinte cu litera x, spatii, etc
b) tr 'x' 'A' < text1 sau: tr ' ' '\t' <text1

Exemple (2):
Combinare redirectare STDIN si STDOUT in diverse comenzi:
ls -l f1 nimic 1>rezult.txt 2>eroare.txt
Fuzionare STDOUT si STDERR:
ls /nimic 1>f3.txt 2>&1
ls /nimic 2>&1 1>f3.txt
(care dintre comenzi va afisa mesajul de eroare pe ecran si dece? vezi curs)

Exemple (3):
Exemple cu comanda cat :
cat f1 f2 f3 sau cat f1 1>f2
cat 1>f2 sau cat (fara fisier de intrare ca argument - sa se explice functionarea)
cat f1 - (asteapta argumente din linia de intrare)

Exemple (4):
Exemple document integrate (here documents)
cat <<final si cat <<-final
wall <<sfarsit

2. Conectarea comenzilor prin pipe-lining


Conecteaza fluxul de iesire al unei comenzi cu fisierul flux de intrare al comenzii urmatoare

Exemple:
Liste cu more si less: ls * |more ls *|less (deosebire), head si tail
Fisierele directoare din dir curent: ls -l | grep "^d"
Cel mai mare fisier din director: ls –al |tr –s " "|sort –nr -k5|head -1|cut –d" " –f10
Utilizatorul care s-a conectat primul: who|sort –k4|line|cut -f1 -d" "
Afiseaza numai uid al utilizatorului: id|cut –f1 –d"("|cut –f2 –d=
Modifica un cuvant: echo "no changes" | sed "s/no/some" sau
Combinatie fuzionare cu pipe: echo "no changes" 1>&2 | sed "s/no/some" (dece?)
Combinatie echo, cat cu asteptare : echo "ceva" |cat f1.txt -

3
s.a.m.d

4
3. Comenzi diverse de cautare/informare
Comenzi de informare/cautare : whoami, whereis, locate
Comanda find
Comanda stat
Comanda du

Exemple:
Se creeaza f1.txt apoi : find / -name f1.txt 2>/dev/null | more
Se creeaza f1.txt intr-un subdirector: find -name f1.txt
find -type d -maxdepth 1
find|more sau find 2>/dev/null |more
stat f1.txt sau stat -c %s f1.txt
du f1.txt

5
De lucrat la laboratoare ptr sapt 6-7-8 (8-29 nov)

1. Imbricarea comenzilor
Utilizare apostroafe inverse `` si $()

Exemple:
echo "Suntem in anul $(date "+%Y") luna `date "+%m` ziua $(date "+%d")
echo "utilizatorul $(whoami) are identificatorul : `id|cut -d" " -f1|cut -d= -f2|cut -d( -f1`"

2. Variabile Shell
Initializare variabile Shell cu valori: caractere, siruri de caractere, valori numerice
Referinta la variabile (prefixare cu $) si afisarea variabilelor cu echo
Afisare variabile prin efect lateral (cu date)
Utilizarea variabilelor Shell in cadrul comenzilor
Operatii aritmetice cu variabile numerice si alte operatii asupra lor cu expr

Exemple:
Initializare: a=5; a=salut; a=25
Afisare: echo $a; echo "\$a are valoarea $a"
Efect lateral: a1= "Buna ziua" date "+$a"
Atentie: expandare caractere generice stocate in variabile : a=* ; echo $a; a=?? ; echo $a
a="f1.txt" ; ls -l $a; cat $a
a=5; b=6; echo $(($a+$b) ; echo `expr $a + $b`
a="salut" echo "variabila \$$a este un sir cu lungimea: $(expr length $a)"

3. Variabile de mediu
Exemple si afisare variabile de mediu: $HOSTNAME, $PWD, $LOGNAME, $PATH
Variabile de mediu speciale: $PS1, $PS2, $?, $$
Comanda set de vizualizare variabile de mediu
Initializare variabila TZ si combinarea ei cu comanda date

Exemple:
TZ=Europe/London date; TZ=Asia/Tokyo date; TZ=America/Los_Angeles date
(vezi comanda tzselect ca sa afli orasele si zonele de pe un continent)

4. Comanda chmod

Exemple:
chmod u+x f1.txt; chmod uo+x+w f1.txt; chmod 0755 f1.txt

6
De lucrat la laboratoare ptr sapt 9-10 (3 dec si 6-11 dec)

1. Probleme recapitulative (neefectuate la Test 2)


Utilizare apostroafe inverse `` si $()

Enunturi:
1. Sa se creeze printr-o singura comanda mkdir directorul Avegers cu doua subdirectoare,
numite Iron Man si respectiv Captain America. Directorul Avengers este subdirector al
directorului curent de lucru.
2. Sa se creeze un subdirector numit Vikings al directorului curent de lucru.
a) Cu o singura comanda touch sa se creeze 2 fisiere vizibile si un fisier invizibil in
subdirectorul Vikings. Cu comanda ls sa se afiseze informatiile doar despre fisierele vizibile din
subdirectorul Vikings.
b) Cu o singura comanda touch sa se creeze un fisier vizibil si doua fisiere invizibile in
subdirectorul Vikings. Cu comanda ls sa se afiseze informatiile doar despre fisierele invizibile
din subdirectorul Vikings.

2. Scripturi Shell
1. Creare script shell simplu (cu extensia sh si shebang) care sa afiseze intr-un format
prietenos numele utilizarorului curent, data calendarisitica, directorul curent de lucru,
directorul home si numele serverului.
#!/bin/bash
# myownscript
# List some information about your current system
echo "Today is $(date)."
echo "You are in $(pwd) and your host is $(hostname)."

2. Sa se creeze un script Shell care utilizeaza afisari cu echo si citire de variabile cu read.

3. Sa se creeze un script shell care va solicita printr-un mesaj numele utilizatorului si ii va


raspunde cu un mesaj de salut.

4. Sa se creeze un script Shell care preia numele utilizatorului si ii raspunde cu "Buna


dimineata" sau "Buna ziua" dupa ora curenta a zilei. Se preia ora curenta cu date, iar
compararea se face cu 12.00. Alte solutii posibile in functue de seatriel date?

5. Problemele 2 si 3 cu preluarea numelui utilizatorului ca parametru in linia de comanda.

7
6. Afisare parametri tastati in linia de comanda.
#!/bin/bash
# myposition
ONE=$1
TWO=$2
THREE=$3
echo "There are $# parameters that include: $@"
echo "The first is $ONE, the second is $TWO, the third is $THREE."

7. Sa se creeze un script Shell care utilizeaza afisari cu echo si citire de variabile cu read. Se va
utiliza if si elif pentru testare valori variabile.
#!/bin/bash
# myos
read -p "What is your favorite operating system, Mac, Windows or Linux? " opsys
if test $opsys = Mac
then
echo "Mac is nice, but not tough enough for me."
elif test $opsys = Windows
then
echo "I used Windows once. What is that blue screen for?"
elif test $opsys = Linux
then
echo "Great Choice!"
else
echo "Is $opsys an operating system?"
fi

8
3. Instructiunea if - elif in scripturi Shell

Probleme cu numere:
Scrieti secventa de comenzi care citeste un numar in 1 si 99 din linia de comanda si il compara
cu un alt numar, 50 de exemplu, cu mesaj corespunzator daca este mai mare sau mai mic ( if,
test cu numere).

Aceeasi problema cu citire numar si afisare mesaj daca acesta este par sau impar (se foloseste
impartirea la 2 sau expr cu modulo - %)

An bisect: Se extrage anul din date se vede daca este bisect sau nu (trebuie sa fie divizibil cu 4,
dar nu cu 100 si divizibil cu 400.). Varianta : se citeste un an calendarisitc (cu read sau ca
paramentru in linia de comanda) si se spune daca este bisect sau nu.

Indicele de masa corporala. Citeste greutatea (kg) si inaltime a(m) si calculeaza indicele masa
corporala: greutate(kg)/inaltime (m). Afiseaza mesaj corespunzator:
18.5 - 25 = normal; 25-29.5 = supraponderal; 30-40 = obezitate; >40 -obezitate accentuata

Aflare minim. Scrieti secventa de comenzi care citeste 3 numere (cu read sau ca parametri in
linia de comanda) si apoi il afiseaza pe cela mic sau mai mare
min=$n1
if test $n2 -lt $min ; then min=$n2 ;
if test $n3 -lt $min; then min=$n3 ; fi

Probleme cu fisiere (1) - Identificare:

1. Scrieti secventa de comenzi prin care se citeste un sir de caractere de la tastatura si apoi se
verifica daca acesta reprezinta un nume de fisier obisnuit din directorul curent.
Sirul va fi introdus (a) prin citire cu read (b) ca parametru in linia de comanda.

2. Scrieti secventa de comenzi prin care se citeste un sir de caractere de la tastatura si apoi se
verifica daca acesta reprezinta un nume de subdirector din directorul curent.
Sirul va fi introdus (a) prin citire cu read (b) ca parametru in linia de comanda.

3. Scrieti secventa de comenzi prin care se cauta un fisierul abc in directorul /tmp si apoi se
afiseaza mesajul : Fisierul abc a fost – nu afost – gasit in directorul /tmp.
Numele fisierului va fi introdus (a) prin citire cu read (b) ca parametru in linia de comanda.

4. Generalizare: numele fisierului si directorului in linia de comanda.

9
De lucrat la laboratoare ptr sapt 13-14 (10 -22 ian 2022)

1. Instructiunea case

Probleme cu case
1. Scrieti secventa de comenzi prin care se citeste de la tastatura si se valideaza un sir format
din maxim 2 litere. Citirea sirului se face cu comanda read sau in linie de comanda

2. Scrieti secventa de comenzi prin care se citeste de la tastatura si se valideaza un sir format
din maxim 2 cifre diferite de 0. Citirea sirului se face conversational, cu comanda read

3. Cele doua probleme combinate : fie doua litere, fie doua cifre

4. Secventa care citeste un sir si verifica daca el contine cel putin o cifra sau cel putin o litera.

Exemple:
case $v1 in
[a-zA-Z] | [a-zA-Z] [a-zA-Z] ) echo "sir OK" ;;
*) echo "Sirul introdus nu corespunde cerintelor ;;
esac

case $v1 in
*[0-9]* ) echo "sir OK" ;;
*) echo "Sirul introdus contine cel putin o cifra cerintelor ;;
esac

2. Instructiunea for pentru lucrul cu fisiere

Probleme cu fisiere (2) - Identificare, verificare, numarare, aflare lungime :


Se va folosi secventa:
for fisier in $dir/*
do
echo $fisier
# alte prelucrari
done

1. Se afiseaza fisierele subdirectoare (numele acestora) dintr-un director dat ca parametru.


Se verifica daca parametrul este un director.

Exemplu:
Solutii de testare parametru ca fiind director :
test ! -d $dir ; then echo eroare; exit; fi
sau
test -d $dir || { echo eroare ; exit ; }

10
2. Se afiseaza (numele de la) toate fisierele obisnuite (ordinare, -f la test) dintr-un director dat ca
parametru, cu lungimea acestora si lungimea totala. Daca nu este dat nici un parametru se lucreaza in
directorul curent daca exista un paramtru se verifica daca acesta este un director
Se valideaza parametrii de intrare: cati parametri exista, daca parametrul este de tiop director.

Exemple:
Lungime fisier : stat -c %s nume_fis sau du -b nume_fis

3. Se numara toate fisierele dintr-un director dat, pe tipurile lor: cate sunt obisnuite, cate directoare,
cate sunt de alt tip. Se afiseaza rezultatul numararii fisierele pe tipuri.

4. Se afiseaza toate fisierele ordinare dintr-un director care au lungimea mai mare decat o anumita
valoare. Numele directorului si valoarea sunt date ca parametru .
Se verifica daca sunt 2 parametri, se verifica dac primul poaram este director si al doilea este un
numar intreg pozitiv mai mare ca 0 (se foloseste case pentru verificare!)

5. Se citesc trei param : tip sursa destinatie. Se copiaza fisierele de "tip" din directorul sursa in cel
destinatie. Se verifica numarul de param , dac sunt numai doi, se copiaza din dir curent in destinatie.
Validari: se verifica tipul (f, d, l, b, c, etc). Se verifica daca sursa si destinatie sunt directoare.

2. Instructiunea while pentru lucrul cu fisiere

Probleme cu while + fisiere (3) - Validare raspunsuri, verificare fisiere, copiere sursa destinatie:

1. Se citeste numele unui fisier text care este dat ca parametru in linia de comanda.
Se numara liniile care contin cifre.
Varianta: liniile care contin cel putin 2 cifre, separate de alte caractere. Se testeaza obligatoriu
daca fisierul exista , este nevid si este de tip text

Exemplu:
# pentru testare se creeaza un fisier text nevid sau sau se foloseste pentru un script deja existent
i=0
while read linie ; do
case $linie in
*[0-9]*) i=$(($i+1))
*) : ;; # : reprezinta nop, nu face nimic "no operation" in shell
esac
done < fis.txt
#de verificat secventa de mai sus

11
2. Se citeste de la tastatura numele unui server public sau din reteaua locala (www.google.ro,
yahoo.com, localhost). Se verifica starea serverului cu ping, cu mesaj corepunzator.

Indicatie: se foloseste /bin/ping -w $N $server 1>/dev/null 2>&1 # ping nu afiseaza pe ecran

server=" " # initializare cu spatiu, sir nevid


while test -n "$rasp" ; do #
echo "Tastati numele unui server public \c "
read server #se opereste la enter, adica citeste un sir vid
if test -n "$rasp" ; then
/bin/ping/ -w $N $server 1>/dev/null 2>&1
retur=$? # codul de retur este 0, 1 sau altceva
if [ $retur -eq 0 ] ; then
echo "$server => operational"
elif [ $retur -eq 1 ] ; then
echo "$server => neoperational"
else
echo "$server => necunoscut"
fi
fi
done
sau varianta:
case $? in
0) echo "$server => operational" ;;
1) echo "$server => neoperational" ;;
*) echo "$server => necunoscut" ;;
esac

3. Se citeste numele unui direcror sursa, o extensie si dir destinatie. Se muta in destinatie fisierel cu
extensia specificata. Sunt doi parametri, atunci copierea se face din directorul curent.

12
Problema pentru cei care doresc probleme mai dificile: cel putin 3 vocale sau 3 cifre

Probleme pentru cei care doresc probleme mai dificile


Sa se scrie un script Shell prin care utilizatorul ghiceste un numar fixat N intre 1 si 99 ; oprire cand
uitlizatorul ghiceste numarul sau la apasare enter

N=73 # se poate genera aleator cu rand


echo "Sunt un Shell UNIX. Am ales un numar intre 1 si 99. Ghiceste acest numar :\c"
read nr
while test -n $nr && test $nr - ne $N ; do # cred ca merge si while test -n $nr
if test $nr -gt $N ; then
echo "Numar prea mare"
else
echo "numar prea mic !"
echo "Ghiceste numar :\c"
read nr

done
if test $nr -eq $N ; then
echo "excellent - esti un campion!" - ai ghicit numarul meu : $N"
else
echo "Vad ca te-ai plictisit - la revedere"
fi

Interesant: Utilizatorul se gandeste la un numar intre 1 si 99, calculatorul il ghiceste ;))

if [ $# -lt 2 ]; then
echo "Utilizare: $(basename "$0") [dirSursa] ext dirDest" 1>&2
# basename afiseaza numele scriptului, fara cale, alfel $0 contine cale+nume script
exit 1
elif [ $# -eq 2 ]; then
dirSursa=.
ext="$1"
dirDest="$2"
else
dirSursa="$1"
ext="$2"
dirDest="$3"
fi

[ -d "$dirSursa" ] || { echo "$(basename "$0"): $dirSursa nu este director !" 1>&2; exit 1 ; }
# ca sa afiseze eroare pe STDERR ca o comanda shell adevarata, altfel echo afiseaza pe STDOUT
mkdir -p "$dirDest" 2> /dev/null

13
# copiaza fisierele
c=0
for file in "$dirSursa"/*."$ext"; do
[ -f "$file" ] || continue
cp "$file" "$dirDest" 2> /dev/null && { c=$((c + 1)) } # incrementeaza daca copirea a avut loc
done

4. Se inlocuiesc majusculele din numele si extensiile fisierelor obisnuite cu cu minuscule. Fisierul trebui
saaiba obligatoriu nume.extensie (se verifica)

if [ -f "$name" ] ; then
before_point="$(echo $name | cut -d'.' -f1| tr 'A-Z' 'a-z')"
after_point="$(echo $name | cut -d'.' -f2 | tr 'A-Z' 'a-z')"

#!/bin/bash # nb: on force à lancer le bash car pas de tableau en dash !


nbStones=5 # nombre de "pierres qui roulent" ;-)
echo -n "You rolled: " # lancement initial, remplissage du tableau et affichage de chaque valeur
for i in $(seq 1 $nbStones) ; do
stone[i]=$(( $RANDOM % 6 + 1 ))
echo -n "${stone[i]} "
done
echo # pour provoquer un retour a la ligne
stop=0
while [ $stop -eq 0 ] ; do
echo -n "Reroll which stone ? "
read answer
for reroll in $answer ; do
if [ $reroll -lt 1 -o $reroll -gt 5 ] ; then
# __variante__ : enchainement de 2 tests avec || au lieu d'un test avec le connecteur -o
# if [ $reroll -lt 1 ] || [ $reroll -gt 5 ] ; then
echo "Invalid entry: $reroll. Must be in 1-5" # message d'erreur
else
stone[reroll]=$(( $RANDOM % 6 + 1 )) # retirage d'une valeur aléatoire
fi
done
echo -n "Your new roll: "
for i in $(seq 1 $nbStones) ; do
echo -n "${stone[i]} "
done
echo
echo -n "Reroll or Quit ? (q to Quit) "
read answer
if [ "$answer" == "q" ] ; then
stop=1
fi
done

14
15

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