További vezérlő valamint számításokat megkönnyítő szerkezetek



Hasonló dokumentumok
További vezérlő valamint számításokat megkönnyítő szerkezetek

7. Laboratóriumi gyakorlat: Vezérlési szerkezetek II.

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

7. Laboratóriumi gyakorlat, 1. rész : Vezérlési szerkezetek II.

Szkriptnyelvek. 1. UNIX shell

1. Alapok. #!/bin/bash

BASH SCRIPT SHELL JEGYZETEK

S z á m í t ó g é p e s a l a p i s m e r e t e k

8. Laboratóriumi gyakorlat: Bevezetés a reguláris kifejezések használatába

8. Laboratóriumi gyakorlat: Bevezetés a reguláris kifejezések használatába

file./script.sh > Bourne-Again shell script text executable << tartalmat néz >>

A héj vezérlő szerkezetei I.

A shell vezérlő szerkezetei I.

BASH script programozás II. Vezérlési szerkezetek

Operációs Rendszerek II. labor. 2. alkalom

8. Laboratóriumi gyakorlat: Bevezetés a reguláris kifejezések használatába

Alapok. tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók

6. BASH programozás I.

Operációs rendszerek. 10. gyakorlat. AWK - bevezetés UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Lekérdezések az SQL SELECT utasítással

AWK programozás, minták, vezérlési szerkezetek

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Webprogramozás szakkör

Operációs rendszerek. 9. gyakorlat. BASH recap, reguláris kifejezések UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Az állományok kezelésére használt fontosabb parancsok


PHP. Telepítése: Indítás/újraindítás/leállítás: Beállítások: A PHP nyelv

C programozási nyelv

Vezérlési szerkezetek

BEKÉRT ADAT KÉPERNYŐRE ÍRÁSA KÖRNYEZETI VÁLTOZÓK FÁJL REDEZETT KIÍRÁSA KÖNYVTÁRBAN BEJEGYZÉSEK SZÁMA FÁJLBAN SZÁM NÖVELÉSE. #!

Karakterkészlet. A kis- és nagybetűk nem különböznek, a sztringliterálok belsejét leszámítva!

A C# programozási nyelv alapjai

A sed folyamszerkesztő

Operációs rendszerek. 9. gyakorlat. Reguláris kifejezések - alapok, BASH UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

chmod umask chown, chgrp

AWK programozás, minták, vezérlési szerkezetek

Komputeralgebra Rendszerek

A programozás alapjai

Reguláris vagy szabályos kifejezések

Operációs rendszerek 1.

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

sallang avagy Fordítótervezés dióhéjban Sallai Gyula

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

A C programozási nyelv I. Bevezetés

Flex tutorial. Dévai Gergely

Szoftvertervezés és -fejlesztés I.

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

A legfontosabb DOS parancsok

Delphi programozás I.

Járműfedélzeti rendszerek II. 2. előadás Dr. Bécsi Tamás

Forráskód formázási szabályok

Operációs rendszerek gyak.

SZÁMÍTÁSOK A TÁBLÁZATBAN

C programozás. 1 óra Bevezetés

Programozás BMEKOKAA146. Dr. Bécsi Tamás 3. előadás

Kézikönyv. Szelekciós operátorok használata

Lekérdezések az SQL SELECT utasítással. Copyright 2004, Oracle. All rights reserved.

II. Mérés SZÉCHENYI ISTVÁN EGYETEM GYŐR TÁVKÖZLÉSI TANSZÉK

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

az Excel for Windows programban

Apple Swift kurzus 3. gyakorlat

Microsoft Excel 2010

Excel 2010 függvények

Permutáció n = 3 esetében: Eredmény: permutációk száma: P n = n! romámul: permutări, angolul: permutation

A C programozási nyelv I. Bevezetés

Bevezetés az informatikába, második gyakorlat. Bevezetés Környezetváltozók és néhány egyszerű utasítás Jogosultságok Fájlkezelés

Mintavételes szabályozás mikrovezérlő segítségével

Számítógép Architektúrák. 4. Gyakorlat

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

AWK programozás Bevezetés

length (s): Az s karaklerlánc hossza, substr(s,m,n): Az s mezőben levő karakterláncnak az m-edik karakterétől kezdődő, n darab karaktert vágja ki.

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Imperatív programozás

Intermec EasyCoder PM4i nyomtató programozásának alapjai Intermec Fingerprint v8.00 nyelven

Szövegek C++ -ban, a string osztály

Operációs rendszerek gyak.

Funkcionális és logikai programozás. { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem }

Operációs rendszerek. 4. gyakorlat. BASH bevezetés, script írása, futtatása UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Occam 1. Készítette: Szabó Éva

Matlab alapok. Baran Ágnes. Baran Ágnes Matlab alapok Elágazások, függvények 1 / 15

Pere László Linux: felhasználói ismeretek I. Az alapok

A sed folyamszerkesztő

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

7. fejezet: Mutatók és tömbök

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Előfeldolgozó rendszer Tömbök. Dr. Bécsi Tamás 4. Előadás

Java programozási nyelv

Programozás Minta programterv a 1. házi feladathoz 1.

Reguláris vagy szabályos kifejezések

A számok kiíratásának formátuma

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Internet programozása. 3. előadás

Objektumorientált Programozás III.

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Szelekció. Döntéshozatal

Hardver leíró nyelvek (HDL)

Kifejezések. A programozás alapjai előadás. Operátorok. Kifejezések. Operátorok precedenciája. Operátorok precedenciája

Átírás:

Tartalom További vezérlő valamint számításokat megkönnyítő szerkezetek 1.A case szerkezet...1 2.A select szerkezet...3 3.Aritmetikai kiértékelés: számítások a (( )) szerkezettel...4 4.A C stílusú for ciklus...6 5.Műveletek karakterláncokkal...7 6.A [[ ]] szerkezet...8 1. A case szerkezet A case vezérlési struktúra hasonló a programozási nyelvek "switch" vezérléséhez: alternatív végrehajtási ágakra bontja a program parancsait. Az alternatívát egy karakterlánc mintákra való illesztése szerint hajtja végre. A következőképpen adjuk meg általános használati formáját: case valtozó in minta1 ) parancsok ;; minta2 ) parancsok ;;... mintan ) parancsok ;; esac A szerkezetet case és esac kulcsszavak határolják. A megatt változóra illeszti a következő sorok elején található mintákat. Ahol a minta talál, ott végrehajtja a jobb zárójel utáni parancssorozatot amelyet két ; karakter zár le. Csak az első találatnak megfelelő alternatívát hajtja végre. A minta típusa héj minta: karaktereket illetve az állománynevek megadásánál használatos metakaraktereket lehet használni: *? [], valamint két minta "vagy" logikával való összekapcsolására a -at. Példák: abc pontosan abc-re illeszkedik * bármire illeszkedik?bc bármi az első karakter pozíción, és utána pontosan bc ab cd ab vagy cd láncokra illeszkedik Az alábbi kis példa (case1.sh) különböző kiválasztásokat végez a parancssor első argumentumát használva: valtozo=${1:? nincs paraméter} case "$valtozo" in a) echo kis a betű ;; 1

[0-9] ) echo egy számjegy ;; *[0-9]* ) echo van benne számjegy ;; *.txt ) echo ".txt" sztringgel végződik ;; * ) echo erre nem írtunk pontos kiválasztást ;; esac Futtatva: $ bash case1.sh 2 egy számjegy $ bash case1.sh a2 van benne számjegy $ bash case1.sh piros erre nem írtunk pontos kiválasztást Az alábbi szkript pedig különböző típusú állományokat szortíroz a típusnak megfelelő könyvtárba: case2.sh ide Utolsó mintának a kiválasztásai sorozatban általában érdemes a * -ot használni, ami akkor hajtódik végre, ha az előző kiválasztások közül egyikre sincs találat: így előállíthatjuk a C programozás switch szerkezetének default ágához hasonló szelekciót. A fenti példában ez az ág azokat az állományokat kezeli amelyeket nem választunk ki mv műveletre. Az alábbi kis program (case3.sh) a parancssor opcióit elemzi. Ha betartjuk azt a feltételt, hogy egy program hívásakor először a kapcsolókat, utána pedig az argumentumokat adjuk meg (és kapcsolókat nem csoportosítunk) akkor ez a szerkezet alkalmas kis programok opcióinak kezelésére. #vegigjárja a paramétereket #a while végén levő shift gonskodik erről while [ -n "$1" ] case $1 in -f ) echo f opció ;; -c ) #a c kapcsolónak van argumentuma #tehát elvégzünk még egy shift-et shift arg="$1" echo c opció, argumentuma "$arg" ;; -* ) echo ismeretlen opció: $1 #ez hiba exit 1 ;; #ha elérkeztünk az első argumentumhoz, #amelyik nem kapcsoló: * ) break;; esac shift #eltoljuk a paramétereket, $1 a következő ne 2

#ha a break-el lépett ki, a $1 egy paramétert tarlamaz if [ -n "$1" ] then echo az elso opciók utáni paraméter: "$1" A program a -c és -f kapcsolót ismeri fel, ha futtatjuk: $ bash case3.sh -f -c 33 22 f opció c opció, argumentuma 33 az elso opciók utáni paraméter: 22 UNIX/héjprogramozás - Vezérlő szerkezetek II A -c opció paraméterének átvétele előtt még egy shift parancsot kell végrehajtani. Természetesen a paraméter értékeket, és létezésüket ellenőrizni kell. Megjegyzés: A héjnak van jobb megoldása az argumentumok kezelésére, a getopts függvény. De kis programoknál a fenti is megteszi. 2. A select szerkezet A select szerkezetet kis interaktív programok esetében használjuk. Használati módja: select valtozo in lista parancsok ne A select kulcsszót tartalmazó sor végrehajtásakor a parancs egy kis menüt ír ki a lista (ez egy sztring lista) segítségével. Ezek után készenléti jelet (prompter) ír ki (ezt a PS3 héj változóból veszi). Válaszként a menü egyik sorát kell kiválasztani úgy, hogy a sorrendjének megfelelő számot ütjük le. Ezek után a select belsejében a valtozo értéke felveszi a listából kiválasztott karakterlánc értékét, és ezt fel lehet használni valamilyen parancsvégrehajtásra. Ugyanakkor a héj $REPLY változója felveszi a beütött szám vagy más sztring értékét. A szerkezet addig ismétli a menü kiírását és a végrehajtást amíg bemenetként állomány vége jelet kap (Ctrl-D) vagy a parancsok végrehajtási részében egy break parancs hajtódik végre. Ha olyan bemeneti számot adunk meg ami nincs a menüben, a változó üres sztringre lesz állítva (a REPLY viszont megkapja a beütött értéket). Működését az alábbi kis példával illusztráljuk: #a PS3 értékét beállítjuk, ez lesz a prompt #csereljük PS3='>>' select valtozo in Elso Masodik Harmadik Vege echo $valtozo echo a '$REPLY' valtozo erteke ilyenkor: "$REPLY" 3

#itt barmilyen parancsot vegre lehet hajtani, felhasznalva #a $valtozo es $REPLY ertekeit if [ "$valtozo" = 'Vege' ];then echo "...és jön a kilépés a select-ből" break ne Működése az alábbi: $ bash select.sh 1) Elso 2) Masodik 3) Harmadik 4) Vege >>1 Elso a $REPLY valtozo erteke ilyenkor: 1 >>2 Masodik a $REPLY valtozo erteke ilyenkor: 2 >> $ Addig ismétli a ciklust, amíg az állomány vége jelet (Ctrl-D) ütjük le vagy kiválasztjuk a 'Vége' opciót. 3. Aritmetikai kiértékelés: számítások a (( )) szerkezettel Amint láttuk, az expr segítségéve elég kényelmetlen számolni. A 90-es évek fejlesztése során egyes héj értelmezők tartalmaznak néhány olyan kiterjesztést, amely könnyűvé teszi az egész számokkal való számítást (a POSIX szabvány is tartalmazza ezt, így a Korn héj is, valamint 2.04 verziótól kezdve a Bash is). Jelenlétére tehát nem lehet mindig számítani és elvileg horzható programok esetén kerülni kell. Ezen kiterjesztések közül a két zárójellel határolt aritmetikai kiértékelést emeljük ki. Egy másik megoldás a héjak let parancsa. A (( )) szerkezet használata az alábbi: valtozo=$(( aritmetikai műveletek )) pontosabban, használat közben: $ x=$(( 22 + 6 )) $ echo $x 28 A két határoló közti területen aritmetikai műveleteket lehet végezni, ugyanolyan szintaxissal mint a C nyelven történő programozásnál. 4

A szerkezetet a teszteknél is lehet használni egész számokkal végzett tesztek esetében: i=4 while (( i > 2 )) echo $i (( i-- )) ne Szabályok a (( )) használatára: -Az operátorok a C nyelvből valóak, minden operátor használható -Kiértékeléskor a Korn héj dupla pontosságú valós számokat használ (a Korn héj tud valós változókkal lgozni). A Bash csak egész számokkal lgozik. -A $ jelet nem kell változók előtt használni, de lehet. Kivételt képeznek a héj speciális változói, azok előtt viszont kell. Tehát: b=$(( a + 2 )), de: b=$(( $a + 2 )) is helyes. A b=$(( $1 + 2 )) összeadást viszont már csak a $ jel segítségével tudjuk elvégezni. -a dupla zárójelen belül nem érvényesek a héj behelyettesítések és metakarakterek, tehát * például használható szorzásra, nem rendelkezik speciális -A C nyelv hozzárendelő operátorai is használhatóak, például: (( x+=2 )) ebben az esetben viszont a $ jel nem használható a változó neve előtt: (( $x+=2 )) #helytelen!!! -Zárójelezés használható -A relációs operátorok esetében az igaz értéke 1 de csak a (( )) belsejében. A tesztek esetében a (( )) -ből való kilépés után a héj? változót fordított értékre állítja. Tehát: $ (( 2 > 1 )) $ echo $? 0 így programban az alábbi món használható: i=4 while (( i > 2 )) echo $i (( i-- )) ne -Nem kell feltétlenül ügyelni a szigorú, héjnál megszokott szóköz elválasztóra operátorok és változók között, tehát írhatunk ((2+2)) -t vagy (( 2 + 2 )) -t is. -A hatványozás operátora a **, ebben az esetben a két * karakternek egymás mellett kell állnia. 5

Az alábbi szkript (szamitasok.sh) néhány példát tartalmaz: #példák számításokra és kifejezés kiértékelésre a (( )) -tel #néhány segédváltozó a=1 b=2 z=0 #használhatók a C nyelv operátorai, a változónevek #előtt nem kell a $ szimbólumot használni echo $(( a + 1)) #az sem számít, ha nem tartjuk be feltétlenül a héj által #kért szóközöket echo $((a+1)) echo $(( a++ )) #van egy eset, amikor kell $ szimbólumot #használni a nevek előtt: #ha a héj speciális változóit használjuk if [ -n "$1" ];then echo $(( $1 + 2 )) #a hatvány operátor a ** echo $(( a**2 )) #feltételekben lehet használni if (( 1 < b )) then echo '1 < b feltétel igaz' 4. A C stílusú for ciklus A (( )) zárójeles szerkezet for ciklusok előállítására is használható, éspedig a C nyelv for utasításához hasonlóan. A szintaxis az alábbi: for (( i=0; i<10; i++ )) héj parancsok #ezekben használható a $i változó... ne Egy egészen egyszerű for ciklust tehát így írhatunk: 6

for (( i=1; i<=10; i++ )) echo $i ne Látható, hogy egész számok végigjárására épülő ciklusokban ez kényelmesebben alkalmazható, mint az előző változatú, sztring lista végégjárására épülő for. 5. Műveletek karakterláncokkal A karakterláncok kezelésénél néha igen hasznos gyorsan elvégezni kis műveleteket, mint például: levágni egy karakterlánc elejét/végét vagy átírni egy részt a karakterláncban. Ezért amikor egy változót kiválasztunk a ${valtozo} szintaxissal, akkor a két {} zárójel közt operátorokat használhatunk erre. Az operátorok az alábbiak: ${valtozo#minta} ${valtozo##minta} ${valtozo%minta} ${valtozo%%minta} $ {valtozo/minta/behelyetesí t} ha a minta illeszkedik a változóban levő karakterlánc elejére, akkor letörli a legkisebb illeszkedést és úgy téríti vissza a karakterláncot ha a minta illeszkedik a változóban levő karakterlánc elejére, akkor letörli a legnagyobb illeszkedést és úgy téríti vissza a karakterláncot ha a minta illeszkedik a változóban levő karakterlánc végére, akkor letörli a legkisebb illeszkedést és úgy téríti vissza a karakterláncot ha a minta illeszkedik a változóban levő karakterlánc végére, akkor letörli a legnagyobb illeszkedést és úgy téríti vissza a karakterláncot behelyettesíti a változóban a mintának megfelelő részté; ha a minta #-el kezdődik a karakterlánc elején, ha % -al akkor a karakterlánc végén. Példák: $ a=abcxyzabc $ echo ${a#abc} xyzabc $ echo ${a%abc} abcxyz $ echo ${a/xyz/abc} abcabcabc A duplázott %% és ## használata akkor inkolt, ha olyan mintát adunk meg, amelybe metakarakterek (*,?) is vannak, amelyek használhatóak. Ezek egy karakterlánc esetében rövidebb vagy hosszabb illesztést is meghatározhatnak. Például, az: abcxyzabcxyz karakterlánc elejére a *abc minta (bármi és utána abc) rövidebben: abc (hiszen az üres 7

karaktereklánc is bármi) vagy hosszabban: abcxyzabc is illeszkedhet. Így a # operátor a legrövidebb illesztést, a ## pedig a leghosszabbat fogja levágni. $ valtozo=abcxyzabcxyz $ echo ${valtozo#*abc} xyzabcxyz $ echo ${valtozo##*abc} xyz Az operátorok könnyebb memorizálása miatt, a következőt tartsuk szem előtt: a # jelet az angolok mindig valamilyen számosság jelölésére használják, és a szám elé teszik, pl. #10, a % jelet pedig mindig a szám után tesszük, pl. 100% (innen a lánc elejére illetve végére utalás). A helyettesítéseken kívül hasznos lehet a változóhossz (változóban levő érték karakterekben való hossza) vagy egy szubsztring kiírása. Amennyiben att egy valtozo nevű változó, a hosszát az alábbi kifejezéssel kapjuk meg: ${#valtozo} és egy szubsztringet az n.től m.-ig terjedő karakterig így címzünk meg: ${valtozo:n-m} az n,m számok 0-tól veszik fel értéküket (első karakter). ha az m hiányzik, az az implicit érték a sztring vége. tehát: $valtozo=abcdef $echo ${#valtozo} 6 $echo ${valtozo:3-5} ef $ $echo ${valtozo:3} def Ha van egy változónk amiben egy fájlnév van, könnyen le tudjuk vágni a fájl típusát tartalmazó végződést, és megtartani a nevet (ha pl. más típusra kell átnevezni egy fájl): $ le="szoveg.txt" $ echo ${le%.*} szoveg $ nev=$( echo ${le%.*} ) $ echo $nev szoveg Vagy egy hosszú fájlrendszerbeli útvonal részeit lehet gyorsan kivágni: 6. A [[ ]] szerkezet A [ ] szerkezet jelenti a klasszikus test parancs végrehajtását, ezt a Bourne shell változatok 8

vezették be. A Korn shell egy új teszt szerkezetet deniált 1986-ban, majd a 1993-as változatban véglegesítette ezt. A szerkezetet a Bash is átvette a 2.05 verziótól kezdve. A [[... ]] a klasszikus teszthez hasonlóan használható. A belsejében a shell nem hajtja végre a shell minták kiterjesztését (*, ~, stb.). Változó helyettesítést, parancs helyettesítést, ~ helyettesítést azonban végez, az idézőjeleket is ugyanúgy használhatjuk mint a parancssoron. A klasszikus teszt [... ] -nek minden operátorát lehet benne használni: Pl.: #az egész számokra vonatkozó tesztek ugyanúgy használhatók if [[ $# -ne 1 ]] # ha $# nem egyenlő 1-el then echo nincs paraméter exit 1 le="$1" #az állományok tulajnságait lekérő tesztek ugyanúgy #használhatóak if [[ -w "$le" ]] #írható-e a fájl? then rm "$le" else echo nincs ilyen fájl A [] teszt operátorain kívül a [[]] szerkezetben az alábbiak használhatók: Sztring teszthez: a -n, -z, = és!= operátorokon kívül használható a < és > operátorok is amelyek karakter alapú összehasonlítást végeznek : $ [[ a < b ]]; echo $? 0 $ [[ a > b ]]; echo $? 1 Az == és!= operátorok esetében ha az operátor jobb oldalán levő sztringet nem tesszük macskakörömbe, használhatunk shell mintákat is benne. Tehát: $ [[ "ab" == a? ]] ; echo $? 0 igazat ad vissza, mert a jobb oldali sztring shell minta, $ [[ "ab" == "a?" ]] ; echo $? 1 viszont hamisat, mert macskakörömben egyszerű sztring a jobb oldali. A Bash shellben a =~ operátor használható bővített szabályos kifejezésekkel való egyeztetésre. A teszt igazat ad vissza, ha a minta illeszkedik a tesztelt sztringre. Például: $ [[ "ab" =~ '^a' ]] ; echo $? 0 9

igazat ad vissza, mert a bal oldal a -val kezdődik. A [[ ]] szerkezeten belül használható a zárójel, ha kifejezést akarunk elhatárolni, illetve az && és kifejezések közti operátorokként valamint a! kifejezés tagadására. Pl. azt, hogy az f változóban levő fájlnévhez létezik szabályos állomány és az állománynév.txt -ben végződik így teszteljük:. $ f=a.txt $ echo a > a.txt $ [[ -f "$f" && "$f" =~ '.txt$' ]] $ echo $? 0 10