Shell script összefoglaló

A VIK Wikiből
(Prog2ShellScriptTutorial szócikkből átirányítva)

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. 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.