250 likes | 417 Views
Linux/UNIX tanfolyam UNIX shell scriptek (½ rész). Tar József (Szüri) szurilo@sch.bme.hu 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).
E N D
Linux/UNIX tanfolyamUNIX shell scriptek (½ rész) Tar József (Szüri) szurilo@sch.bme.hu 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 • continueA 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
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 Vezérlési szerkezetek
#!/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/bash if test $# -le 5 then echo Az argumentumok szama kisebb vagy egyenlo mint 5. else echo Az argumentumok szama nagyobb mint 5. fi Egyszerű scriptek
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ásaecho $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