Shell script összefoglaló
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
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. Egy példa a föggvények használatára:
Mint a példában látható, 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.