Sunteți pe pagina 1din 5

Sisteme de Operare Laborator nr.

Laborator nr. 4

Scripturi shell

1. Funcţii shell (recapitulare din laborator nr. 2)

Formatul general pentru definirea unei functii este:


function func_name{
cmd1; ... cmd2;
}
func_name()
{ cmd1; ... cmd2; }

unde func_name este numele functiei, parantezele marcheaza definirea functiei, iar
intre acolade este specificat corpul functiei. Se impune ca prima comanda sa fie separata
de acolada cu un blanc, iar ultima comanda sa fie terminata cu caracterul ';' daca acolada
se afla pe aceeasi linie cu comanda.
#!/bin/bash
function f()
{
echo "$# param: $*"
}
f "$*"
f "$@"

Transmiterea parametrilor din linia de comanda catre functii:

#!/bin/bash
# scriptul se apeleaza cu parametri in linia de comanda
func ()
{
echo "$1"
}
echo "primul apel: fara argumente."
func
echo "============================================================"
echo "al doilea apel: se trimit explicit parametrii din linia de comanda."
func $1
exit 0

In contrast cu alte limbaje de programare, scripturile transmit parametrii doar prin


valoare catre functii. Numele variabilei (care este de fapt pointer), daca este transmis ca
parametru functiei, va fi tratat ca siruri de caractere.

Valorile de return

Starea de iesire a unei functii poate fi explicit specificata prin apelul


return [n]

Odata efectuat apelul se iese din functie. Daca n este omis, codul returnat este cel al
ultimei comenzi executate. Valoarea returnata poate fi accesata prin variabila $? si poate fi
testata in structurile de control if, while si until.

1
Sisteme de Operare Laborator nr. 4

2. Exemple de scripturi:

1. Afisarea continutului unui fisier cu liniile numerotate

#!/bin/sh

for filename
do
linecount="1"
while read line
do
echo "${linecount}: $line"
linecount="$(($linecount + 1))"
done < $filename
done
exit 0

2. Scriptul urmator verifica daca caracterele citite de la tastatura sunt alfanumerice


(fara semne de punctuatie, caractere speciale sau spatii

#!/bin/sh
# validAlphaNum - caractere alfanumerice
validAlphaNum()
{
# Validare arg: return 0 daca toate caracterele sunt litere sau
cifre, # si 1 altfel
# sterge toate caracterele nedorite si verifica daca sirul initial
# este identic cu cel rezultat
compressed="$(echo $1 | sed -e 's/[^[:alnum:]]//g')"
if [ "$compressed" != "$input" ] ; then
return 1
else
return 0
fi
}
# exemplu de utilizare
echo -n "Introduceti caractere: "
read input
if ! validAlphaNum "$input" ; then
echo "Introduceti doar litere si numere." >&2
exit 1
else
echo "date de intrare valide."
fi
exit 0

Pentru a permite caracterele virgula, spatii si puncte se inlocuieste expresia


regulata cu: sed 's/[^[:upper:] ,.]//g'
Testul pentru introducerea unui nr de telefon (numere intregi, spatii, paranteze si
linii):
sed 's/[^[:digit:]\(\)- ]//g'

2
Sisteme de Operare Laborator nr. 4

3. Afisarea continutului unui fisier:

#!/bin/bash
#
# open_file.sh: print the contents of orders.txt
declare LINE
exec 3< file.txt
while read LINE <&3 ; do
printf “%s\n” “$LINE”
done
exit 0

Fisierul file.txt este redirectat catre descriptorul de fisier 3 (ultimul care poate fi
utilizat de un program). Descriptorul 0 – intrarea standard, 1 – iesirea standard, 2 – stderr
– iesirea standard de eroare. Read primeste intrarea de la descriptorul 3.

4. Calculul maximului a doua numere [1]:

#!/bin/bash
# max.sh: Maximum of two integers.
E_PARAM_ERR=251 # If less than 2 params passed to function.
EQUAL=250 # Return value if both params equal.
# Error values out of range of any
#+ params that might be fed to the function.

max2 () # Returns larger of two numbers.


{ # Note: numbers compared must be less than 257.
if [ -z "$2" ]
then
return $E_PARAM_ERR
fi
if [ "$1" -eq "$2" ]
then
return $EQUAL
else
if [ "$1" -gt "$2" ]
then
return $1
else
return $2
fi
fi
}

max2 33 34
return_val=$?
if [ "$return_val" -eq $E_PARAM_ERR ]
then
echo "Need to pass two parameters to the function."
elif [ "$return_val" -eq $EQUAL ]
then
echo "The two numbers are equal."
else
echo "The larger of the two numbers is $return_val."
fi
exit 0

3
Sisteme de Operare Laborator nr. 4
3. Probleme propuse pentru rezolvare:

3.1. Scrieti un script care pentru un parametru primit in linia de comanda sa


genereze urmatoarea structura de directoare pentru un proiect C:
~/<prj_name>|-bin/
|-obj/
|-src/-<prj-name>_src.c
|-inc/-<prj-name>_inc.h
|-<prj-name>.c
|-<prj-name>.h
|-build.sh
Trebuie scrisa o functie pentru validarea numarului argumentelor din linia de
comanda si daca este format doar litere, cifre , caracterele “-” si “_”. Scriptul va afisa mesaj
de eroare daca nu sunt respectate cerintele.

3.2. Pornind de la scriptul realizat anterior, scrieti un nou script care sa primeasca
ca argumente in linia de comanda: numele proiectului, tipul fisierelor ce trebuie generate
(C/C++) si numarul de fisiere sursa si header ce trebuie generate. Numele fisierelor
header si sursa din directoarele inc si src sunt de forma:
<prj_name>_<numar>.<extensie> in functie de tipul proiectului (C/C++)

Scriptul se apeleaza cu o linie de forma:


./<nume_script>.sh <nume_proiect> <c/c++> <numar intreg>

Daca primeste din linia de comanda:


- doar numele proiectului, atunci tipul proiectului va fi C si va genera cate un singur
fisier in directoarele inc, respectiv src.
- doar numele si tipul proiectului, atunci va genera cate un singur fisier in
directoarele inc, respectiv src;
- daca primeste doar un singur argument, si acesta este --help sau -h, scriptul
trebuie sa afiseze cu instructiunile de apelare.
- daca nu primeste argumente in linia de comanda, sau acestea sunt mai multe de
3, atunci scriptul trebuie sa afiseze un mesaj de eroare si instructiunile de apelare.

Exemple de apelare corecta a scriptului:


./script.sh proiect c 3
./script.sh proiect1 C++ 2
./script.sh proiect C
./script.sh proiect2 c++
./script.sh -h
./script.sh --help

Alte cerinte obligatorii:


- Trebuie scrise functii shell separate pentru afisarea mesajului de ajutor/eroare,
pentru generarea proiectului si fisierelor sursa si header (tipul si numarul de fisere se
transmit ca argumente functiei de generare)
- In functie de numarul de argumente, trebuie facute si urmatoarele validari: daca
primul argument contine doar litere sau cifre si nu alte caractere, daca al doilea argument
este doar de forma C sau C++ (indiferent daca sunt litere mari sau litere mici) si daca al
treilea este de tip numeric
- Trebuie scrise functii pentru validarea argumentelor din linia de comanda

4
Sisteme de Operare Laborator nr. 4
4. Bibliografie:

• Mendel Cooper, Advanced Bash-Scripting Guide


http://tldp.org/LDP/abs/abs-guide.pdf
http://tldp.org/LDP/abs/html/
• Machtelt Garrels, Bash Guide for Beginners, 2008
http://tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf
http://tldp.org/LDP/Bash-Beginners-Guide/html/
• Mihai Budiu - Elemente de programare în Shell-ul Unix
http://www.cs.cmu.edu/~mihaib/articles/shell-2/shell-2-html.html
• Gareth Anderson, GNU/Linux Command-Line Tools Summary, 2006
http://tldp.org/LDP/GNU-Linux-Tools-Summary/GNU-Linux-Tools-
Summary.pdf
http://www.tldp.org/LDP/GNU-Linux-Tools-Summary/html/
• BASH Frequently-Asked Questions
http://www.faqs.org/faqs/unix-faq/shell/bash/
• William E. Shotts Jr., Writing shell scripts
http://linuxcommand.org/writing_shell_scripts.php

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