Shell script összefoglaló

A VIK Wikiből
A lap korábbi változatát látod, amilyen Unknown user (vitalap) 2012. október 21., 21:08-kor történt szerkesztése után volt. (Új oldal, tartalma: „{{GlobalTemplate|Infoalap|Prog2ShellScriptTutorial}} ==Bevezetõ== A shell script nem más, mint a unix értelmezője (shell) által végrehajtható parancsok s…”)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)

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:

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.