Shell script összefoglaló
Bevezetõ
A shell script nem más, mint a unix értelmezője (shell) által végrehajtható parancsok sorozata egy file-ban összegyűjtve. Mivel a shell tud változókat kezelni és megért néhány vezérlőszerkezetet, a shell script nem csak kötegelt feldolgozásra jó; programok megvalósítására is alkalmas. Shell scriptek írásához a unix parancsok ismeretére van szükség.
A kezdetekkor felmerülhet néhány kérdés:
- Milyen szerkesztővel írjuk a scripteket?
- Lásd: ShellSzerkesztes
- Hogyan próbáljuk ki a shell scripteket?
- Lásd: ShellSzerkesztes
- Hol találok átfogó leírást a unix parancsokról?
Az értelmező
A unix világában több értelmező közül választhatunk,
az eredeti sh mellett a legelterjedtebbek: bash (Bourne Again shell), a ksh (Korn shell) és a csh (C shell).A shell script elején jeleznünk kell hogy melyik értelmezőt szeretnénk használni a script futtatása során.Minden shell script az ertelmezo eleresi utjanak megadasaval kezdodik:
#!/bin/sh
vagy
#!/bin/bash
vagy
#!/bin/ksh
vagy
#!/bin/csh
stb.
Egy egyszerű program
Az alábbi program személteti, hogy hogyan
használhatjuk kötegelt feldolgozásra a shell-t.
#!/bin/bash #Kedvenc enekesnoim: echo "Ella Fitzgerald" echo "Aretha Franklin" echo "Lisa Ekdahl"
- Kommentek*:
A shell script a legelső kötelező #!/bin/bash típusú sor kivételével minden *#* karakterrel kezdődő sort figyelmen kívül hagy, így ilyen sorokba írhatjuk kommentjeinket.
- A ; karakter*:
Érdemes tisztázni a *;* karakter szerepét a shell scriptben: A fenti script futtatása ugyanazt eredményezi, mintha a három echo parancsot beírtuk volna a parancssorba és mindhárom után enter-t nyomtunk volna. *;* -t csak abban az esetben kell használnunk, ha több parancsot egy sorba akarunk írni.Ezesetben a *;* jellel választhatjuk el a parancsokat egymástól.Pl.:
#!/bin/bash echo "Ella Fitzgerald"; echo "Aretha Franklin"
Változók
A változókat nem kell előre megadnunk, csak egyszerűen értékadással(*=* jel) hozzuk létre őket. A már létrehozott változókra később $változó alakban hivatkozhatunk.Ha egy valtozo erteket meg akarjuk valtoztatni ugyanúgy járjunk el, mintha most hoznánk létre! A shell scriptben nincs típusa a változóknak, az adott parancsok megpróbálják a számukra előírt típusúnak értelmezni az adott változót.
A változók használatára egy egyszerű példa:
#!/bin/bash #A valtozok letrehozasa egyszeru ertekadassal tortenik: SINGER="Frank Sinatra" lyric="My funny Valentine" #A valtozokra $valtozo alakban hivatkozhatunk. echo "$SINGER egy ismert dala a $lyric" #Egy mar letezo valtozo erteket ugyanugy modosithatjuk, #mint ahogy a valtozot letrehoztuk. lyric="Strangers in the night" echo "$SINGER egy ismert dala a $lyric"
- Fontos*:
- az *=* jel körül nem lehet szóköz.
A ="a" ,A= "a", A = "a"
nem működnek. - Egy változó nevében csak alfanumerikus karakrerek és <bold>_</bold> szerepelhet.A változó nevének betűvel vagy *_* -sal kell kezdődnie.
- A shell scriptben mindig minden karaktersorozatot tegyünk <bold>"</bold> jelek közé!Pl. Actor=Scott Joplin értékadás Actor változóba a Scott értéket akarja tenni, majd a Joplin utasítást akarja végrehajtani, így ez a sor hibát okoz.
- Ha a stringünkbe " jelet szeretnénk kiiratni akkor azt \" használatával tehetjük meg.
Egy másik példa a változók használatára:
#/bin/bash #vegyunk ket szamot! Alpha=3 Beta=2 #Adjuk ossze oket! Gamma=`expr $Alpha + $Beta` #Irjuk ki az eredmenyt! echo "$Gamma"
- Megjegyzés*:Ha valamit *`* jelek közé írunk,azt a shell végrehajtja és a
parancs kimenetét helyezi a *`* jellel hatérolt rész helyére. pl.: Gamma=`expr 3 + 2` ugyanaz, mint a Gamma=5
- Figyelem*: A *`* jel nem azonos a *'* (sima idézõjel) -lel!
- Megjegyzés*:
Az expr egyszerű unix parancs, a paraméterében megadott számokra elvégzi a szintén paraméterként megadott műveletet:
Gamma=`expr 3 - 2` Gamma=`expr 3 \* 2` Gamma=`expr 3 / 2`
...stb. A művelet jele köré kötelező egy-egy szóközt tenni. A *-ot escapelni kell, mert alapesetben a munkakönyvtárban lévő összes fájl neve helyettesítődik a helyére.
Speciális változók
A shell scriptben néhány változó kitüntetett szereppel bír:
- $# :A shell script meghívásakor megadott paraméterek száma.
- $0 :Az az elérési út, amellyel meghívták a scriptünket.
- $1..$9 :Az egyes paraméterek
- $@ :Az összes paraméter egyben.
- $* :Az összes paraméter egyben, de tekintet nélkül a whitespace-ekre.Pl.:"Judy Garland" -ból "Judy" "Garland" lesz.
Nézzük az alábbi példát!
#/bin/bash # Nagybetus nevu filet kisbetusse konvertalo program # Ha a parameterek szama nem 1 akkor kiirjuk hogy kell # hasznalni a progit if [ $# -ne 1 ] then echo "Nagybetus nevu filet kisbetusse konvertalo program" echo "Hasznalat: <pre> #!/bin/bash # megnezzuk hany ora van. # erre valo a date parancs, mellyel # tetszoleges formatumban visszaadja # nekunk az aktualis idopontot. # Az alabbi forma csak az ora-t adja # vissza, pl.: 12 Hour=`date +%H` #Ha $Hour < mint 12 akkor... #-lt jelentése: less than if [ $Hour -lt 12 ] then echo "Délelőtt van" else echo "Délután van" fi
<file neve>"
else
NEW_NAME=`echo |tr [A-Z] [a-z]` if [ "$NEW_NAME" != "" ] then mv "" "$NEW_NAME" fi
fi
További, összetettebb shell scriptekben használatos speciális változók is vannak a shell scriptekben:
- $? A legutoljára végrehajtott parancs visszatérési értéke.
- $$ Az épp futó shell script PID-je (Process IDentifier)
- $! Az utolsó háttérben futó folyamat PID-je
Feltételes szerkezetek
Példa if használatára:
if [ $Hour -lt 12 ];then
Így néz ki egy if-es szerkezet a shell scriptben.
- Fontos*:
- Az if és a then külön parancsok, ezért ha egy sorba akarjuk írni őket, akkor azt az alábbi formában thehetjük meg
#!/bin/bash read X case $X in "Hot") echo "It's too damn hot..." ;; "Jazz") echo "All that Jazz" ;; *"Band") echo "Herbie Hancock Band" ;; *) echo "Nem ismerem!" ;; esac
- A *[* maga is egy unix parancs, az utána írt részek mind paraméterei.Ezért mindenütt egy szóközt tennünk a feltétel írása során: a *[* jel után, az operandusok és az operátor közé és a ] jel elé is.
Továbbá ezért -lt alakú az operátor(ez a [ parancs egy kapcsolója).
- A *[* parancs voltaképpen a test unix parancs másik elnevezése (aliasa), de ha ilyen néven használjuk, az utolsó paraméter kötelezően ].
Példák a test használatára:
Példa case használatára
#!/bin/sh for i in 1 2 3 4 5 a b c d e do echo "A ciklusváltozó értéke: $i" done
Ebből a példából világosan látszik, hogy hogyan kell egy case szerkezetet megírni shell scriptben.
- Fontos*:
- A ;; itt a szintaxis része, nem utasításokat kapcsol össze.
- Az eseteknél használhatunk wildcardokat. a *"Band" eset minden Band-ra végződő stringet elfogad.
- A default esetet a * jelképezheti.
Ciklusok
for ciklust nagyon egyszerűen írhatunk shell scriptben, egyszerűen csak fel kell sorolnunk az elemeket, melyeken szerenénk végigmenni.
#!/bin/sh for i in * do echo "A ciklusváltozó értéke: $i" done
- Fontos*: a *** karakter önmagában leírva egy shell scriptben a könyvtárban található összes
file-t jelenti.Próbáljuk ki ezt a parancsot: echo * A *** jel ezen tulajdonságát kihasználva könnyen készíthetünk olyan ciklust, mely végiglépdel egy könyvtár összes file-ján
#!/bin/bash echo "Gepelje a szoveget!" echo "befejezes:VEGE (Uj sorban, sor elejen)" while [ "$INPUT" != "VEGE" ] do read INPUT echo "$INPUT" >> file.txt done
A while ciklus nagyon egyszerû: addig hajtja végre a do és a done közötti utasításokat, amíg a while utáni feltételrész igaz. A feltételben test-et használjunk!
#/bin/bash # Ez a fuggveny kisbetusse konvertal egy file-t,ha annak neveben van nagybetu # ret valtozot beallitja annak megfeleloen, hogy at kellett-e nevezni # a file-t vagy nem lowercaser () { NEW_NAME=`echo |tr [A-Z] [a-z]` if [ "$NEW_NAME" != "" ] then mv "" "$NEW_NAME" ret=" -> $NEW_NAME" else ret="A $i file-t nem kell atnevezni" fi } #itt a "Foprogram" for i in * do lowercaser $i echo "$ret" done
Függvények
A shell scriptben lehetõség van függvények létrehozására is. A függvény a paramétereit ugyanúgy kezeli, mint a shell script a hívási paramétereit. A visszatérési érték kezelése igen egyszerû: A példában a függvényen belül értéket adunk a ret változónak,majd nyugodtan hivatkozhatunk a ret változóra a függvényen kívül.
Példák
- Készítsünk shell scriptet, mely megszámolja, hogy a vele azonos könyvtárban található *.java fileokban hány sor található!
- ShellPelda1
- Készítsünk shell scriptet, mely az elsõ paraméterben megadott könyvtárban a második paraméterben másodpercben megadott idõnél régebbiek!
- ShellPelda2
-- Merlin - 2005.05.10.