2013 m. rugsėjo 23 d., pirmadienis

Skriptinis programavimas

Shell – komandinės eilutės aplinka – sąsaja su operacine
sistema, užtikrinanti vartotojo įvestų komandų
interpretavimą.
 Aplinka turi savo scenarijų kalbos interpretatorių.
 Dažniausiai yra naudojama bash (Bourne Again Shell)
aplinka.
 Scenarijai (Script) sudaromi pagal tam tikras taisykles iš
atskirų komandų.

Aplinkos
 sh (Bourne Shell)
 bash (Bourne-again Shell)
 csh (C Shell)
 ksh (Korn Shell)
 ash (Almquist Shell)
 tcsh (TENEX C Shell)
 zsh (Z Shell)

Aplinkos komandos
 Aplinkos skiriasi scenarijų interpretavimo kalbomis.
 Dauguma elementarių komandų sutampa.
 Komandų pavadinimai paprastai sudaromi iš atitinkamą
veiksmą nusakančių žodžių, pvz., cp iš žodžio copy.

Aplinkos komandos
 Į komandos eilutę įvesti žodžiai traktuojami tokiu būdu:
 Pirmas žodis suprantamas kaip komanda,
 Visa kita – komandos parametrai.
 Aplinka atlieka keletą dalykų:
 Patikrinama ar tai vidinė aplinkos komanda, t.y. ar aplinka
moka ją įvykdyti.
 Jei ne, tikrinama, gal tai komandos pavadinimo pakaitalas;
 Arba ieško programos nurodytu vardu ir perduoda eilutėje nurodytus
parametrus.

Teisės į failą
 Vienas iš failo atributų.
 Teisės gali būti:
 Priklausomybės, nusakomos savininkui, grupei ar visiems
kitiems;
 Veiksmų, leidžiančios skaityti, rašyti ir vykdyti.
 Kiekvienas failas turi savininką;
 Kiekvienas failas priklauso tam tikrai grupei;

Teisės į failą
 Savininkas su savo failu gali daryti viską, tačiau jis negali
pakeisti failo savininko, tai gali padaryti tik
administratorius;
 Vykdymo teisės į failą leidžia įvykdyti programą ar
scenarijų.
 Vykdymo teisės į katalogą leidžia pažiūrėti jo turinį.
 Norint ištrinti failą, reikia turėti rašymo teisę.

Teisės į failą
 Teisės į failą užrašomos tokio tipo eilute:
-rwxr-xr-x
 Pirmasis minuso ženklas reiškia, kad tai paprastas failas, o ne
katalogas (žymimas d raide);
 Likę simboliai grupuojami po 3:
 Pirmoji grupė nusako autoriaus teises,
 Antroji – grupės teises,
 Trečioji – visų kitų vartotojų teises.
 Simbolių reikšmės:
 r reiškia teisę skaityti,
 w – rašyti,
 x – vykdyti,
 “-” ženklas atitinkamoje pozicijoje reiškia, kad tokia teisė nesuteikta

Teisės į failą
 Teisės keičiamos tokia komanda:
chmod {+,-}{r,w,x} failai
 +/- simboliai nusako ar teisę suteikti, ar atimti.

Pagalbinės komandos
 cal [[mėnesis] metai] – konkretaus mėnesio ar
visų metu kalendorius
 cal 9 2012

Pagalbinės komandos
 date [+”datos_formatas”] – data ir laikas:
 %m – mėnuo (01-12)
 %d – mėnesio diena (1-31)
 %Y – paskutiniai du metų skaitmenys
 %H, %M, %S – valandos, minutės ir sekundės
 %D – data (formatas mm/dd/yy)
 date +”%Y-%m-%d, %H:%M:%S”

Pagalbinės komandos
 echo “Labas, pasauli”
 printf “Suma lygi %d\n”, 100

Pagalbinės komandos
 bc – tekstinės sąsajos skaičiuoklio iškvietimas
 darbo pabaiga nurodoma klavišų kombinacija Ctrl+D

Pagalbinės komandos
 man [komandos_vardas] – informacija apie
komandas

Kintamųjų vardų apsirašymo taisyklės
 Tarp kintamojo vardo ir reikšmės neturi būti tarpų:
 no=10 – kintamojo apsirašymas
 no =10 – neteisingas kintamojo deklaravimo pavyzdys
 no= 10 – neteisingas kintamojo deklaravimo pavyzdys
 no = 10 – neteisingas kintamojo deklaravimo pavyzdys
 Kintamųjų varduose skiriamos didžiosios ir mažosios raidės:
 no=10 – echo $no – išves 10
 No=11 – echo $No – išves 11
 NO=20 – echo $NO – išves 20
 nO=21 – echo $nO – išves 21
 Galima apsibrėžti kintamuosius, turinčius NULL reikšmę:
 kint=
 kint=“”
 Įvykdžius komandą echo $kint – nieko nerodys, nes kintamasis
neturi reikšmės

Komanda echo
 Naudojama teksto, kintamųjų reikšmių atvaizdavimui
ekrane:
 echo [parinktys] [tekstas, kintamieji]
 a=123
 echo $a # išves 123
 echo a # išves a, bet ne kintamojo reikšmę 123
 Kaip apibrėžti kintamąjį x su reikšme 10 ir jo reikšmę
atspausdinti ekrane?
 Kaip apibrėžti kintamąjį xn su reikšme Studentas ir jo
reikšmę atspausdinti ekrane?Komanda expr
 Naudojama aritmetikos veiksmams atlikti:
 expr a + b – dviejų skaičių sudėtis
 expr a – b – dviejų skaičių skirtumas
 expr a / b – dviejų skaičių dalyba
 expr a % b – liekana a mod b
 expr a \* b – dviejų skaičių daugyba
 echo `expr a + b` - atspausdins aritmetinio veiksmo
rezultatą
 echo “expr a + b” – atspausdins expr a + b
 Kaip atspausdinti dviejų kintamųjų dalybos rezultatą?
 Dalybos rezultatą pateikti kaip trečią kintamąjį.Nurodyti klaidas scenarijuje
Vardas=Petriukas
ManoOS=Linux
ManoNr=10
echo “Mano vardas yra $vardas”
echo “Mano OS yra $ManoOS”
echo “Mano numeris yra ManoNr. Ar
matote šį numerį?”


Komanda read
 Naudojama duomenų įvedimui klaviatūra. Įvesti
duomenys priskiriami atitinkamam kintamajam:
 read variable1, variable2, ...
 Sukurti scenarijų, kuris prašys vartotojo įvesti vardą, kuris
bus saugomas kaip kintamasis vardas. Panaudoti šį
kintamąjį sakinyje, pvz., “Labas vardas, būkime
draugais”.Įvedimo/Išvedimo srauto nukreipimas
 Dauguma komandų rezultatus išveda į ekraną, tačiau galima
išvedimo srautą nukreipti į failą ar įvesti duomenis iš failo.
 Yra trys srautų nukreipimo simboliai:
 >
 komanda>failo_pavadinimas – jei duomenys tame faile jau buvo,
jie bus prarasti;
 >>
 komanda>>failo_pavadinimas – nauji duomenys prirašomi prie
failo pabaigos;
 <
 komanda<failo_pavadinimas – duomenys imami iš failo, vietoj to,
kad įvedinėti klaviatūra.
 Pvz., komanda<failas1>failas2 – duomenys imami iš
failas1, rezultatai talpinami į failas2.Komandos cat ir tac
 cat
 cat failas1 – ekrane pateikiamas failo turinys
 cat failas1>failas2 – failas1 turinys perduodamas
failas2
 cat failas1 failas2>failas3 – sujungiamas dviejų
failų – failas1 ir failas2 turinys į vieną failą – failas3
 cat>failas1 – užpildyti tuščią failą klaviatūra įvedamu
tekstu
 cat>>failas1 – papildyti failą klaviatūra įvedamu tekstu
 tac
 panaši į komandą cat. Tik failų eilutės skaitomos nuo failo
pabaigos (pradedant paskutiniąja eilute).Pavyzdys
 Failą w1.txt užpildykime tekstu, įvedami klaviatūra. Į failą
w2.txt perrašykime failo w1.txt turinį atvirkščia tvarka.
Failus w1.txt ir w2.txt sujunkime į vieną w3.txt.
 cat>f1.txt # Užpildome tuščią failą klaviatūra įvedamu tekstu;
Pirmoji eilutė
Antroji eilutė
Trečioji eilutė
 cat f1.txt # Peržiūrime ekrane failo f1.txt turinį
 tac f1.txt>f2.txt # failo f1.txt turinys perduodamas
kitam failui f2.txt (tik atvirkščia tvarka)
 cat f2.txt # Peržiūrime ekrane failo f2.txt turinį
 cat f1.txt f2.txt>f3.txt #Sujungiami failų f1.txt ir
f2.txt turiniai į kitą failą f3.txt
 cat f3.txt #Peržiūrime ekrane failo f3.txt turinįScenarijus
 Parašykite scenarijų, kuris apskaičiuoja dviejų įvestų
skaičių sandaugą ir rezultatą įrašo į tekstinį failą.
 Parašykite scenarijų, kuris apskaičiuoja dviejų įvestų
skaičių sandaugą, iš kurios paskui yra atimama 3. Abu
rezultatai pridedami prie faile esamo teksto, neištrynus jo.Komanda wc
 Naudojama teksto eilučių, žodžių ir simbolių
skaičiavimui:
wc [parinktys] [failų_vardas]
 -l – skaičiuoja tik eilutes
 -w – skaičiuoja tik žodžius
 -m – skaičiuoja tik simboliusPavyzdys
 Peržiūrėti anksčiau sukurto ir užpildyto failo f1.txt, bei
visų failų f1.txt, f2.txt ir f3.txt statistiką
 wc f1.txt # Į ekraną išveda failo f1.txt eilučių, žodžių
ir simbolių skaičių
 wc f?.txt # Į ekraną išveda visų galimų f?.txt failų
eilučių, žodžių ir simbolių skaičiųKomanda grep
 Leidžia ieškoti sutapimo su šablonu nurodytame failų
sąraše:
grep [parinktys] “šablonas” [failo_pavadinimas]
 grep “ieškomas žodis” failo_pavadinimas -
nurodo eilutę, sutampančią su šablonu
 grep –n “ieškomas žodis” failo_pavadinimas
– nurodo eilutės numerį ir pačią eilutę, sutampančią su šablonu
 grep –v “ieškomas žodis” failo_pavadinimas
– nurodo eilutę (-es), kuriose nerasta sutapimo su šablonuKomandos head ir tail
 head – parodo pirmas 10 failo eilučių.
 tail – parodo paskutines 10 failo eilutes.
 head failo_pavadinimas
 tail failo_pavadinimas
 head –n failo_pavadinimas – parodo pirmas n
failo eilučių
 tail –n failo_pavadinimas – parodo paskutines
n failo eilučiųsort komanda
 Komanda išdėsto failo įrašus abėcėlės arba skaitmenine
tvarka.
 Pagal nutylėjimą rūšiavimas atliekamas didėjimo tvarka
 -r – rūšiavimas priešinga tvarkapipe-priemonės
 Komandos rezultatų perdavimas kitai komandai
komanda1|komanda2
 Pavyzdys: cat stud|sort – komanda cat
neparodys failo stud turinio, o iš karto perduos jos
rezultatus rūšiavimo komandai sort, kuri surūšiuotus
įrašus išves į ekranąsed komanda
 Teksto paieškos ir modifikavimo komanda
sed [parinktys] ‘komanda’ failas
 Teksto modifikavimas:
sed [parinktys] ‘[opcijos]/ką
pakeisti/kuo pakeisti/[opcijos]’ failassed komanda
 sed –e ‘s/Sveiki/Labas/’ failas1 – pakeis
pirmą žodį “Sveiki” į “Labas” faile failas1
 sed –e ‘s/Sveiki/Labas/g’ failas1 –
pakeis visus žodžius “Sveiki” į “Labas” faile failas1
 sed –e ‘3,5s/Sveiki/Labas/g’ failas1 –
nuo 3 iki 5 eilutėse pakeis visu žodžius “Sveiki” į “Labas”
faile failas1
 sed 1,2d failas1 – ištrina failas1 pirmą ir antrą
eilutes
 sed /^P/d failas1 – ištrina eilutes, kurios
prasideda raide P



3 praktinis užsiėmimas
Jelena Zubova Sąlygos operatoriai naudojamai, kai norima, jog
scenarijus priimtų sprendimus, t.y. vykdytų
komandas atsižvelgdamas į esamą situaciją. if galimos reikšmės:
◦ tiesa (true) – vykdomos
then šakoje esančios
komandos
◦ netiesa (false) –
vykdomos else šakoje
esančios komandos
 Komandų kiekis bet
kurioje šakoje
neribotas.
 Sintaksė:
if [ sąlyga ]
then
komanda_1
komanda_2
.........
else
komanda_x
komanda_y
.........
fi Jei sąlyga_1 reikšmė
tiesa, vykdomos then
šakos komandos.
 Jei sąlyga_1 reikšmė
netiesa, tikrinama
sąlyga_2:
◦ jei reikšmė yra tiesa,
vykdomos vidinio if
operatoriaus then šakos
komandos
◦ jei reikšmė netiesa, vykdomos
else šakos komandos
 Sintaksė:
if [ sąlyga_1 ]
then
komanda_1
komanda_2
.........
else if [ sąlyga_2 ]
then
komanda_x
komanda_y
.........
else
komanda_xx
komanda_yy
..........
fi
fi Naudojant elif
operatorių užtenka vieno
fi pagrindinio
operatoriaus užbaigimui.
 Sintaksė:
if [ sąlyga_1 ]
then
komanda_1
komanda_2
.........
elif [ sąlyga_2 ]
then
komanda_x
komanda_y
.........
else
komanda_xx
komanda_yy
..........
fi [ sąlyga_1 –o sąlyga_2 ] – loginė sudėtis,
“arba” jungtis:
◦ operatoriaus reikšmė bus tiesa, jei bent viena iš sąlygų yra
tiesa,
◦ netiesa – priešingu atveju.
 [ sąlyga_1 –a sąlyga_2 ] – loginė
daugyba, “ir” jungtis:
◦ operatoriaus reikšmė bus tiesa, jei visų sąlygų reikšmės bus
tiesa,
◦ netiesa – priešingu atveju. Skaičių palyginimas:
◦ $a –eq $b – tiesa, jei abu skaičiai (a ir b) lygūs
◦ $a –ne $b – tiesa, jei skaičiai (a ir b) nelygūs
◦ $a –gt $b – tiesa, jei skaičius a didesnis už skaičių b
◦ $a –ge $b – tiesa, jei skaičius a didesnis arba lygus
skaičiui b
◦ $a –lt $b – tiesa, jei skaičius a mažesnis už skaičių b
◦ $a –le $b – tiesa, jei skaičius a mažesnis arba lygus
skaičiui b Eilučių palyginimas
◦ $eil1 == $eil2 – tiesa jei abi eilutės (eil1 ir eil2)
yra vienodos
◦ $eil1 != $eil2 – tiesa, jei eilutės (eil1 ir eil2) yra
nevienodos
◦ -n $eil – tiesa, jei eilutė (eil) yra netuščia
◦ -z $eil – tiesa, jei eilutė (eil) yra tuščia Parašykite scenarijų, kuris patikrintų, ar du klaviatūra
įvedami skaičiai yra lygūs. Jei taip, į ekraną turi būti
išvestas pranešimas “Įvesti skaičiai lygūs”. Priešingu
atveju – “Įvesti skaičiai yra nelygūs”.
 Parašykite scenarijų, kuris patikrintų, ar dviejų
klaviatūra įvedamų skaičių sandauga lygi 0. Jei taip, į
ekraną turi būti išvestas pranešimas “Bent vienas iš
įvestų skaičių lygus 0”. Priešingu atveju turi būti
apskaičiuota tų dviejų skaičių sandauga ir išvestas
pranešimas “Įvestų skaičių sandauga lygi X”. Parašykite scenarijų, kuris patikrintų, ar pirmas
įvestas skaičius yra didesnis už antrą. Jei taip, raskite
dviejų įvestų skaičių skirtumą. Priešingu atveju
patikrinkite, ar pirmas skaičius mažesnis už antrą.
Jei taip, raskite tų skaičių sumą. Priešingu atveju į
ekraną turi būti išvestas pranešimas “Du įvesti
skaičiai a ir b yra lygūs”. -s $f – tiesa, jei failas f yra netuščias
 -f $f – tiesa, jei failas f yra egzistuojantis paprastas failas
 -d $f – tiesa, jei failas f yra egzistuojantis katalogas
 -e $f – tiesa, jei failas f yra egzistuojantis failas
 -r $f – tiesa, jei failas f yra egzistuojantis failas ir
vartotojas turi teisę jį skaityti
 -w $f – tiesa, jei failas f yra egzistuojantis failas ir
vartotojas turi leidimą jį redaguoti
 -x $f – tiesa, jei failas f yra egzistuojantis failas ir
vartotojas turi leidimą jį vykdyti
 $f -ot $g – tiesa, jei failas g yra naudotas vėliau nei failas
f
 $f -nt $g – tiesa, jei failas f yra naudotas vėliau nei failas
g Sukurkite scenarijų, kuris patikrina ar egzistuoja
failas su vartotojo įvestu failo pavadinimu. Jei taip, į
ekraną išvedamas šio tekstinio failo eilučių kiekis.
Priešingu atveju išvedamas pranešimas “Failas f
neegzistuoja”. Naudojamas, kai
kintamojo reikšmių
diapazonas yra
diskretus ir yra ne
platus.
 Tokiais atvejais patogiau
naudoti case vietoje if
operatoriaus.
case $kintamasis in
reikšmė_1)
komanda_1
komanda_2
…………………;;
reikšmė_2)
komanda_x
komanda_y
…………………;;
esac Sukurkime scenarijų su meniu, kuris patikrintų ar
failas egzistuoja, ar direktorija egzistuoja, ar
vartotojas turi teisę failą redaguoti.echo “1 – tikrina ar failas
egzistuoja”
echo “2 – tikrina ar direktorija
egzistuoja”
echo “3 – tikrina ar failas gali būti
redaguojamas”
echo “Įveskite 1, 2 arba 3 norėdami
atlikti tam tikrą veiksmą”read p
case $p in
1)
echo “Įveskite failo pavadinimą”
read f
if [ -f $f ]
then
echo “Failas $f egzistuoja”
else
echo “Failas $f neegzistuoja”
fi;;2)
echo “Įveskite katalogo pavadinimą”
read f
if [ -d $f ]
then
echo “Katalogas $f egzistuoja”
else
echo “Katalogas $f neegzistuoja”
fi;;3)
echo “Įveskite failo pavadinimą”
read f
if [ -w $f ]
then
echo “Teisė redaguoti $f failą yra”
elif [ -f $f ]
then
echo “Failas $f neegzistuoja”
else
echo “Teisės redaguoti $f failą
nėra”
fi;;*)
echo “Tokio meniu punkto nėra”
esac
 Šiame pavyzdyje panaudota speciali reikšmė “*”,
kuri reiškia visus kitus atvejus.echo “1 – tikrina ar failas egzistuoja”
echo “2 – tikrina ar direktorija
egzistuoja’
echo “3 – tikrina ar failas egzistuoja”
echo “Įveskite 1, 2 arba 3 norėdami
atlikti tam tikrą veiksmą’
read p
case $p in
1)
echo “Įveskite failo pavadinimą”
read f
if [ -f $f ]
then
echo “Failas $f egzistuoja”
else
echo “Failas $f neegzistuoja”
fi;;
2)
echo “Įveskite katalogo pavadinimą”
read f
if [ -d $f ]
then
echo “Katalogas $f egzistuoja”
else
echo “Katalogas $f
neegzistuoja”
fi;;
3)
echo “Įveskite failo pavadinimą”
read f
if [ -w $f ]
then
echo “Teisė redaguoti $f failą
yra”
elif [ -f $f ]
then
echo “Failas $f
neegzistuoja”
else
echo “Teisės redaguoti
$f failą nėra”
fi;;
*)
echo “Tokio meniu punkto nėra”;;
esac Sukurkite scenarijų su meniu, kuris, priklausomai nuo
pasirinkto meniu punkto, apskaičiuotų dviejų įvestų
skaičių:
1) sumą (jeigu įvesti skaičiai nelygūs, priešingu atveju
išvedamas pranešimas “Įvesti skaičiai lygūs”)
2) sandaugą (jeigu abu skaičiai nelygūs 0, priešingu
atveju išvedamas pranešimas “Abu skaičiai lygūs 0”)
3) skirtumą (jeigu įvesti skaičiai nelygūs, priešingu
atveju išvedamas pranešimas “Įvesti skaičiai a ir b
lygūs”) Kai tenka vykdyti tas pačias komandas keletą kartų,
patogiau naudoti ciklus. Dažniausiai yra naudojami
dviejų tipų ciklai:
◦ for
◦ while Naudojant ciklus būtina:
◦ inicializuoti kintamąjį (priskirti pradinę reikšmę)
◦ nurodyti ciklo vykdymo sąlygą
◦ apibrėžti ciklo kintamojo reikšmės kitimo dėsnį a) forma
for kintamasis in sąrašas
do
komanda_x
komanda_y
done
Ciklo kintamojo pradinė reikšmė yra pirmasis
elementas sąraše. Ciklas vykdomas tol, kol
nepasiekiama sąrašo pabaiga. Kiekvienoje iteracijoje
ciklo kintamojo reikšme taps kitas sąrašo elementas.for i in 1 2 3 4 5 6 7 8 9 10
do
echo $i
done
Šiuo konkrečiu atveju į ekraną bus išvedami skaičiai nuo 1
iki 10. b) forma
for ((inicializavimas; sąlyga; kitimo
dėsnis))
do
komanda_x
komanda_y
done
Ciklo kintamojo inicializavimas atliekamas priskiriant
pradinę reikšmę. Toliau nurodoma kokią reikšmę pasiekus
ciklas yra nutraukiamas. Būtina nurodyti ciklo kintamojo
kitimo dėsnį, priešingu atveju gausime begalinį ciklą.for ((i=1; i<=10; i++))
do
echo $i
done
Šiuo konkrečiu atveju į ekraną bus išvedami skaičiai
nuo 1 iki 10. Ciklo cikle pavyzdys:
for ((i=1; i<=5; i++))
do
for ((j=1; j<=5; j++))
do
echo –n $i
done
echo “”
done
 Komanda echo –n spausdina rezultatus toje pačioje
eilutėje.
 Vieno išorinio ciklo iteracijoje spausdinamos 5 vidinio ciklo
iteracijos.while [ sąlyga ]
do
komanda_x
komanda_y
.........
done
 Kadangi ciklas while
neturi tokios
antraštės, kaip for
ciklas, todėl pradinę
ciklo kintamojo
reikšmę bei kitimo
dėsnį reikia apibrėžti,
atitinkamai, prieš ciklą
ir pačiame cikle.i=1
while [ $i –le 10 ]
do
echo $i
i=`expr $i + 1`
done Vartotojas įveda dviejų failų pavadinimus. Sukurkite
scenarijų, kuris nustatytų, kuris failas turi daugiau
eilučių. Į ekraną turi būti išvedami atitinkami
pranešimai:
◦ „Failas a turi daugiau eilučių“
◦ „Failas b turi daugiau eilučių“
◦ Arba „Failai a ir b turi vienodą eilučių skaičių“

Etiketės