Tutorial Shell Scripting: Diferență între versiuni
(→Bazele programarii Shell (bash)) |
(→Bazele programarii Shell (bash)) |
||
| Linia 310: | Linia 310: | ||
va afisa toate fisierele si directoarele din directorul /bin cu exceptia celor care incep cu un caracter aflat in seria mentionata | va afisa toate fisierele si directoarele din directorul /bin cu exceptia celor care incep cu un caracter aflat in seria mentionata | ||
| + | |||
| + | ===Mai multe comenzi intr-o singura linie de comanda=== | ||
| + | |||
| + | <i>Sintaxa</i> | ||
| + | #comanda1; comanda2 | ||
| + | |||
| + | <i>Exemple</i> | ||
| + | #date; who | ||
| + | |||
| + | Comanda de mai sus va afisa data de astazi urmata de userul cu care suntem logati. In exact acelasi scop poate fi folosita si urmatoarea linie de comanda: | ||
| + | |||
| + | #date who | ||
| + | |||
| + | ===Procesarea liniei de comanda=== | ||
| + | |||
| + | Incercati urmatoarea comanda (se presupune ca fisierul <b>script.sh</b> nu exista pe sistemul dumneavoastra): | ||
| + | |||
| + | #ls script.sh | ||
| + | |||
| + | Va fi afisat un mesaj asemanator cu urmatorul: | ||
| + | |||
| + | - script.sh: No suh file or directory | ||
| + | |||
| + | <b>ls</b> este numele unei comenzi efective si shell-ul o executa in momentul in care aceasta este tastata la prompter. Acum ia nastere o alta intrebare <b>Ce sunt comenzile?</b>. Ce se intampla cand tastam <b>#ls script.sh</b>? | ||
| + | Primul cuvant al liniei de comanda este <b>ls</b> - numele comenzii ce urmeaza sa fie executata. Orice altceva pe acea linie este citit ca fiind un argument pentru comanda respectiva. | ||
| + | |||
| + | #tail +10 script.sh | ||
| + | |||
| + | Numele comenzii este <b>tail</b> iar <b>+10</b> si <b>script.sh</b> sunt considerate argumente ale acestei comenzi. | ||
| + | <b>Nota:</b> | ||
| + | <b>$#</b> detine numarul de argumente specificate in linia de comanda. Iar <b>$*</b> sau <b>$@</b> se refera la toate argumentele date scriptului. | ||
Versiunea de la data 10 iunie 2006 15:03
Cuprins
- 1 Bazele programarii Shell (bash)
- 1.1 Cum scriem scripturi shell
- 1.2 Variabilele in Shell
- 1.3 Cum sa utilizam variabilele definite de utilizator
- 1.4 Reguli in definirea variabilelor (atat cele ale sistemului cat si cele definite de utilizator)
- 1.5 Cum afisam si accesam variabilele definite de utilizator
- 1.6 Comanda echo
- 1.7 Operatii aritmetice
- 1.8 Mai multe despre ghilimele
- 1.9 Exit Status - Starea de exit
- 1.10 Declaratia de citire (read)
- 1.11 Meta caracterele (folosite pentru specificarea globala a numelui unui fisier)
- 1.12 Mai multe comenzi intr-o singura linie de comanda
- 1.13 Procesarea liniei de comanda
Bazele programarii Shell (bash)
Cum scriem scripturi shell
Urmatorii pasi sunt necesari pentru scrierea scripturilor shell:
- folositi editorul dumneavoastra preferat (eu folosesc mcedit); primul rand din fisier trebuie sa fie urmatorul:
#!/bin/bash
- dupa scrierea scriptului, setati permisiunile fisierului dupa cum urmeaza:
chmod permisiuni script Exemplu: # chmod +x scriptul-meu # chmod 755 scriptul-meu
- executarea scriptului dupa cum urmeaza:
Sintaxa bash scriptul-meu sh scriptul-meu ./scriptul-meu Exemple # bash scriptul-meu # sh scriptul-meu # ./scriptul-meu
Acum suntem pregatiti sa scriem primul script shell care va afisa "Acesta este primul meu script". Vom crea fisierul scriptul-meu.sh in care vom pune liniile de mai jos. Crearea fisierului si scrierea lui se va face folosind comenzile:
# touch scriptul-meu.sh # mcedit scriptul-meu.sh
#!/bin/bash clear echo "Acesta este primul meu script"
Dupa salvarea fisierului putem rula scriptul cu urmatoarea comanda:
# ./scriptul-meu.sh
Vom observa ca scriptul nu a fost rulat deoarece nu am setat atributul de executie scriptului. Pentru a face acest lucru vom rula comanda:
# chmod +x scriptul-meu.sh
Acest script va sterge ecranul si va afisa apoi pe acesta "Acesta este primul meu script" Pentru scripturi scrise in shell scripting este recomandat sa se foloseasca extensia .sh penntru a fi mai usor recunoscute.
Exercitiu. Scrieti si executati urmatorul script:
#!/bin/bash clear echo "Buna $USER" echo "Astazi este"; date echo "Numarul userilor logati este"; who | wc -l echo "Calendarul este" cal
Variabilele in Shell
In shell scripting exista doua tipuri de variabile:
- Variabilele sistemului, acestea sunt create si mentinute de catre linux, si sunt scrise cu majuscule;
- Variabilele definite de catre utilizator, acestea sunt scrise cu minuscule.
Pentru a vizualiza o lista cu toate variabilele sistemului si valorile atribuite acestora, se poate da comanda shell:
# set
Pentru a vizualiza doar valorile unor anumite variabile se pot da comenzile:
# echo $USER # echo $HOME
Cum sa utilizam variabilele definite de utilizator
Sintaxa numele_variabilei=valoare
Urmatoarea atribuire este corecta:
# numar=10
Urmatoarea nu este corecta, deoarece numele variabilei trebuie sa se afle in stanga semnului egal iar valoare atribuita acesteia in dreapta.
# 10=numar
Salvati si executati urmatorul script
#!/bin/bash clear numar=10 echo $numar
Reguli in definirea variabilelor (atat cele ale sistemului cat si cele definite de utilizator)
- Variabilele pot fi formate din cel putin un caracter alfanumeric sau pot incepe cu un caracter "underscore" (_) urmat de cel putin un caracter alfanumeric.
Exemple HOME SYSTEM_VERSION vehicul numar
- Nu folosite spatii in nici una din partile semnului egal.
Urmatoarea atribuire este corecta:
numar=10
Urmatoarele atribuiri sunt insa incorecte:
numar =10 numar= 10 numar = 10
- Variabilele sunt case-sensitive, la fel ca si numele fisierelor in linux. Urmatoarele variabile nu sunt identice, ci diferite:
no=10 No=11 NO=20 nO=2
- Pot de asemenea fi definite variabile nule, dupa cum se vede in exemplul urmator:
vehicul= vehicul=""
Cum afisam si accesam variabilele definite de utilizator
Pentru a afisa si accesa variabilele definite de utilizator se va utiliza:
Sintaxa: $numele_variabilei
Definirea variabilei vehicul si numar se va face dupa cum urmeaza:
# vehicul=autobuz # numar=10
Pentru afisarea variabilelor se va folosi:
# echo $vehicul # echo $numar
Pentru afisarea valorii variabilei vehicul nu folositi echo vehicul deoarece va afisa cuvantul vehicul si nu continutul acestei variabile.
Exercitiu: scrieti si rulati urmatorul script. Va atentionam ca am introdus intentionat anumite greseli pentru a va testa vigilenta.
#!/bin/bash numele_meu=ADI sistemul_meu = DEBIAN numarul_meu=10 echo "Numele meu este $numele_meu" echo "Sistemul meu este $sistemul_meu" echo "Numarul meu este numarul_meu, poti vedea acest numar?"
Comanda echo
Aceasta comanda este folosita pentru a afisa pe ecran text sau valori ale unor variabile.
Sintaxa generala a comenzii este:
#echo [optiuni] [insiruire de caractere, variabile...]
Optiunile folosite sunt urmatoarele:
-e activeaza interpretarea caracterului backslash in sirul de caractere care urmeaza
-E dezactiveaza interpretarea acestuia
\\ afiseaza caracterul backslash in sine
\a efectueaza o avertizare sonora (eu sunt la distanta de server in acest moment)
\b are efectul apasarii tastei backspace de pe tastatura, sterge ultimul caracter afisat
\c sterge sirul de caractere care urmeaza acestei comenzi, va fi afisat doar ceea ce este in fata lui "\c"
\n face trecerea la o linie noua
\r are efectul apasarii tastei enter
\t afiseaza caracterul tab (invizibil)
Operatii aritmetice
Pentru efectuarea operatiilor aritmetice este folosira comanda expr:
Sintaxa: expr argument1 operator_matematic argument2
Operatorul matematic poate fi:
+ adunarea
- scaderea
/ impartirea
% restul impartirii
* inmultirea
Exista si alti operatori matematici insa acestia vor fi discutati mai tarziu pe parcursul acestui tutorial.
Observatie:
- in exemplul de mai jos executia comenzii expr se face folosind ghilimele inclinate, si nu ghilimele simple si nici duble; urmatoarele exemple sper sa va lamureasca in legatura cu folosirea ghilimelelor pentru executia comenzilor:
#echo "expr 4 + 5" #echo 'expr 4 + 5' #echo `expr 4 + 5`
Trebuie mentionat ca intotdeauna folosirea ghilimelelor inclinate are ca efect executia comenzii shell care se afla intre acestea si folosirea in script a rezultatului obtinut prin executarea comenzii respective. Acest lucru este universal valabil in programarea shell, nu numai in cazul comenzii expr.
Mai multe despre ghilimele
In programarea de tip shell bash exista trei tipuri de ghilimele:
"ghilimele duble" - tot ceea ce se afla intre glilimele duble este considerat doar o insiruire de caractere, cu exceptia caracterelor \ si $
'ghilimele simple' - tot ceea ce se afla intre ghilimele simple va ramane neschimbat
`glilimele inclinate` - sunt folosite pentru a executa comanda aflata intre acestea
Exemple: #echo "Astazi este data" #echo "Astazi este `date`"
Se observa ca in primul caz a fost afisat sirul de caractere "Astazi este data" iar in cel de-al doilea caz este afisata data de astazi.
Exit Status - Starea de exit
De obicei, in Linux, daca o anumita comanda sau script au fost executatate, ele returneaza doua tipuri de valori, care sunt folosite pentru a vedea daca comanda sau scriptul au fost executate corect sau nu.
Daca valoarea returnata este 0 atunci comanda a fost executata cu succes iar daca valoarea returnata este diferita de 0 atunci a aparut o eroare in executarea comenzii sau a scriptului.
Pentru a avea valoarea starii de exit, se foloseste variabila speciala $?. Urmatoarele exercitii sper sa va lamureasca in legatura cu folosirea acestei variabile speciale.
Exemple: # expr 1 + 2 # echo $? # echo Buna ziua # echo $? # wildwest sunt_obosit? # echo $? # date # echo $? # echon $? # echo $?
Declaratia de citire (read)
Aceasta declaratie este folosita pentru preluarea datelor de la utilizator prin intermediul tastaturii si memorarea datelor in variabile.
Sintaxa read variabila1, variabila2,... variabilaN
Urmatorul script ii cere utilizatorului numele si apoi asteapta introducerea acestuia de la tastatura. Utilizatorul introduce numele la tastatura (dupa scrierea numelui trebuie apasata tasta ENTER) si numele introdus prin intermediul tastaturii este memorat in variabila fname
#mcedit script.sh
# #script pentru citirea numelui de la tastatura # echo "Numele dumneavoastra va rog:" read fname echo "Buna $fname, ma bucur de cunostinta!"
Rularea acestuia se va face in felul urmator:
#chmod 755 script.sh #./script.sh
Numele dumneavoastra va rog:adrian Buna adrian, ma bucur de cunostinta!
Meta caracterele (folosite pentru specificarea globala a numelui unui fisier)
Meta caracterul:
* - potriveste orice caracter sau grup de caractere ? - potriveste orice caracter dar numai unul [...] - inlocuieste doar cu caracterele aflate intre paranteze
Exemple #ls /bin/[a-c]*
va afisa toate fisierele si directoarele din directorul /bin care incep cu litera a, b sau c
#ls /bin/[!a-f]* sau #ls /bin/[^a-f]*
va afisa toate fisierele si directoarele din directorul /bin cu exceptia celor care incep cu un caracter aflat in seria mentionata
Mai multe comenzi intr-o singura linie de comanda
Sintaxa #comanda1; comanda2
Exemple #date; who
Comanda de mai sus va afisa data de astazi urmata de userul cu care suntem logati. In exact acelasi scop poate fi folosita si urmatoarea linie de comanda:
#date who
Procesarea liniei de comanda
Incercati urmatoarea comanda (se presupune ca fisierul script.sh nu exista pe sistemul dumneavoastra):
#ls script.sh
Va fi afisat un mesaj asemanator cu urmatorul:
- script.sh: No suh file or directory
ls este numele unei comenzi efective si shell-ul o executa in momentul in care aceasta este tastata la prompter. Acum ia nastere o alta intrebare Ce sunt comenzile?. Ce se intampla cand tastam #ls script.sh? Primul cuvant al liniei de comanda este ls - numele comenzii ce urmeaza sa fie executata. Orice altceva pe acea linie este citit ca fiind un argument pentru comanda respectiva.
#tail +10 script.sh
Numele comenzii este tail iar +10 si script.sh sunt considerate argumente ale acestei comenzi. Nota: $# detine numarul de argumente specificate in linia de comanda. Iar $* sau $@ se refera la toate argumentele date scriptului.