Linux/UNIX tanfolyamUNIX shell scriptek (½ rész)
Tar József (Szüri)[email protected]
2005. november 7.
Héjak(shellek)
• A UNIX rendszerek legalapvetőbb munkakörnyezete• Közönséges felhasználói program• Sokféle héj létezik
– sh– csh– ksh– tcsh– ash– vsh– zsh– bash
Héjak(shellek)
• Legfontosabb tulajdonságok:– Parancsértelmező, mely a parancsokat a standard
bemenetről(stdin) vagy fájlból olvassa– Egyszerűen kialakíthatók az ún. shell
sriptek(parancsállományok)– A shell scripteket ugyanúgy paraméterezhetem akárcsak a
programokat– Ez egy programnyelv, mely string változókra és hatékony
vezérlési szerkezetekre épül.– Lehetővé teszi a B/K átirányítását, csővezetékezést, processzek
kezelését– Könnyű konfigurálhatóság, stb.
Parancssor,argumentumok,B/K
• Egy parancssor legegyszerűbb formája:
parancs arg1 arg2 … argn
pl. grep pista /etc/passwd• A paraméter lehet:
– egyszerű karakterlánc– állománynév– karakterlánc joker(helyettesítő) karakterekkel– Egy újabb parancs, ez a parancshelyettesítés
• Be/Kivitel átirányítása– stdin (0)– stdout (1)– stderr (2)
B/K átirányítás
• stdin– pl.: cat < file1– vagy cat 0< file1
• stdout– pl.: ls > file2– vagy cat 1> file3
• hozzáfűzés stdout-al (>>)– Pl.: cat >> file4
• stderr– find / -name "*" -print
– find / -name "*" -print 2> /dev/null
Csővezeték(pipe)• Speciális állomány ami egy FIFO-t valósít meg.• A csővezeték mérete véges• A stdin és stdout is csővezetékbe irányítható.• pl. sort file1 | wc –w >file2• Vagy pl. ls | pr• A FIFO-nak nem kell nagynak lennie(csak 8Kb) hiszen
az egyes parancsok párhuzamosan futnak.• Az eredmény a cső végén még azelőtt megjelenhet,
mielőtt az első program az összes bemenetét feldolgozná.
Parancshelyettesítés
• Egy programnak paraméterként egy másik program eredményét adjuk át.
• Pl.: more `grep –l halacska *`• A különbség a csővezeték és a parancshelyettesítés
között az, hogy míg a csővezetéknél az adatok a stdin-ről jönnek azok párhuzamosan is végrehajtódhatnak, addig itt az aposztrófok közé szorított parancsnak ki kell teljesen értékelődnie mielőtt eredménye átadódhatna.
Parancssorozatok,Joker karakterek
• Pontosvesszővel elválasztás: pl.: date ; ls• Egy parancs végrehajtása után hátrahagy egy kilépési
értéket(exit status).• || és && használata, feltételesen végrehajtódó sorozat
– parancs1 || parancs2– parancs1 && parancs2
• Joker karakterek:* nulla vagy tetszőleges számú tetszőleges karakter
? Pontosan egy tetszőleges karakter
[abd] Az „a” avgy „b” vagy „c” karakterek egyike
[a-z] Az a-z intervallumból egy karakter
Szinkronizáció, background
• Eddig a kiadott parancsaink egymás után szinkronban futottak le.
• Lehetőség van azokat egyszerre, egymással aszinkron állapotban is futtatni.
• pl.: date &• Vagy pl. cc source > program &• Parancskiadásakor egy a parancshoz rendelt folyamat
jön létre azonosítóval együtt. – megszakítás(CTRL-Z), újraindítás(fg)– jobs parancs kiadásával megtekinthetjük a felfüggesztett
folyamatokat
Shell script(parancsállomány)
• Egy shell script egy szöveges fájl, mely parancsokat és vezérlési szerkezeteket tartalmaz. Legyen egy ilyen shell scriptünk most a my_script nevű. Tartalma:
#!/bin/bash
echo Hello World
• A shell maga is egy program ahogy azt már említettük, vagyis rekurzíve újra lefuttatható.
• Egy shell scriptet így egy shellből a következőképpen futtathatok:
sh my_scipt
Bourne Shell(változók)
• Irjuk be a parancssorba: ora=24
• Ezután egy parancsfájlba azt hogy echo Egy nap $ora órából áll
• A rendszer válasza:Egy nap órából áll
• Ez gáz. Ilyenkor exportálnunk kell. (export ora)
Bourne Shell(változók)• Speciális változók:
– $0 parancsállomány neve– $# indítási paraméterek száma– $* összes indítási paraméter– $1, $2,…,$n az első második n-edik paraméter– $$ processz szám– $HOME home katalógus neve– $PATH keresési út– Stb.
Legfontosabb belső parancsok• break
Kilép a while, until, for vagy select hurokból
• continue A while, until, for vagy select következõ ciklusát kezdi el
• eval [Argumentum ...] Beolvassa az Argumentumokat shell inputként, és az eredményként létrejövõ parancso(ka)t végrehajtja
• exit
A shell befejezi futását és az n értékkel tér vissza
• let Kifejezés ...Kiértékeli a megadott atritmetikai kifejezést
• read [Var]Beolvas egy sort a standard bemenetrõl a Var változóba
• shift [n]Átszámozza a pozíciós paramétereket n+1-tõl kezdve 1, 2 ...-re.
Legfontosabb belső parancsok• A feltételeket a test, az [ és ] illetve a [[ és ]] parancspárral adhatjuk
ki, állományok jellemzõinek vizsgálatára, számok, stringek összehasonlítására
• [-a File] Igaz, ha a File létezik • [-n String] Igaz, ha a String nem nulla hosszúságú • [File1 -nt File2] Igaz, ha File1 létezik és újabb, mint File2. • [String = Minta] Igaz, ha a String egyezik a Mintával • [String1 > String2] Igaz, ha String1 a String2 után következik
könyvtári sorrendben • [Kifejezés1 -eq Kifejezés2] Igaz, ha a Kifejezés1 egyenlõ Kifejezés2-
vel. • [Kifejezés1 -lt Kifejezés2] Igaz, ha a Kifejezés1 kisebb, mint
Kifejezés2 • [Kifejezés1 -ge Kifejezés2] Igaz, ha Kifejezés1 nagyobb vagy
egyenlõ, mint Kifejezés2
Vezérlési szerkezetek
If feltétel:
If parancsok
then parancsok
else parancsok
fi
For ciklus:
for i in s1 s2 …
do parancsok
done
If test $1=‘alma’
then echo ‘$1=alma’
fi
for i in alma körte
do echo $i
done
Vezérlési szerkezetek
While ciklus:
while parancsok
do parancsok
done
Until ciklus:
until parancsok
do parancsok
done
C=0
while [ $C -lt 10 ];
do echo The counter is $C
C=`expr $C + 1`
done
C=20
until [ $C -lt 10 ];
do echo C $C
C=`expr $C - 1`
done
Vezérlési szerkezetek
Case szerkezet:
Case word in
minta1) parancsok ;;
minta2) parancsok ;;
esac
case $# in
1) echo 1 ;;
2) echo 2 ;;
*) echo sok
esac
Egyszerű scriptek
#!/bin/bash echo Kérlek add meg a neved read NAME echo "Hi $NAME!"
#!/bin/bash tar -cZf /var/my-backup.tgz /home/me/
#!/bin/bashif test $# -le 5
then echo Az argumentumok szama kisebb vagy egyenlo mint 5. else echo Az argumentumok szama nagyobb mint 5.
fi
Számok összege 1-től a megadottig.
• #!/bin/bash • sum=0 • i=1 • while [ $i -le $1 ]; • do sum=`expr $sum + $i` • i=`expr $i + 1` • done • echo $sum
Milyen nap van ma?
#!/bin/bash
Mon=hetfo
Tue=kedd
Wed=szerda
Thu=csutortok
Fri=pentek
Sat=szombat
Sun=vasarnap
nap=`date +%a` # date +%a csak annyit ír ki, hogy Mon vagy Tue stb.
eval echo Ma \$$nap van.
n! kiszámítása ciklussal
#!/bin/bash
i=$1
# kezdő érték beállításafac=1while [ $i -gt 0 ]dofac=`expr $fac \* $i` # kell a per jel a szorzásjel előtt, különben
# syntax errort kapunki=`expr $i - 1`done# eredmény visszaírása
echo $fac
Két sztring összehasonlítása
#!/bin/bash
S1='string'
S2='String'
if [ $S1!=$S2 ]; then
echo "S1('$S1') nem egyenlő S2('$S2')-vel"
fi
if [ $S1=$S1 ]; then
echo "S1('$S1') egyenlő S1('$S1')-vel"
fi
Hány Anna nevû user van összesen és ezek közül hányan nincsenek
bejelentkezve?
#!/bin/bash
x1=`cat /etc/passwd | grep Anna | wc -l`
x2=`finger | grep Anna | wc -l`
x3=`expr $x1 - $x2`
echo $x3
Linkek
• http://www.gnu.org/software/bash/bash.html• http://www.tldp.org/LDP/abs/html/• http://en.wikipedia.org/wiki/Bash
• http://elmfiz.elte.hu/fizinf/OpRendszerek/bash.html• http://www.inf.u-szeged.hu/~bmse/unix/unix3.html• http://progkor.inf.elte.hu/200506.1/unix.html• http://home.fazekas.hu/~egmont/unix/shell.html• http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/hu/Bash-
Prog-Intro-HOWTO-hu.txt• http://shell-script-programing.sync.hu/SHELL_PROGRAMOZAS.htm• http://heather.cs.ucdavis.edu/~matloff/UnixAndC/Unix/CShellII.html
Köszönöm a figyelmet!