ABSTRACT: test und grundlagen von bash scripts werden erklaert. AUDIENCE: advanced users SYSTEM: any unix SECTION: basic unix commands AUTHOR: mond COPYRIGHT: GNU Free Documentation Licence http://www.gnu.org/licenses/fdl.txt die ersten kurzen shellscripts haben wir ja schon bei der erklaerung von bash behandelt. heute wollen wir die shell scripts etwas genauer behandelt. schwerpunkt ist wie immer die bash aber die meisten der techniken funktionieren in dieser oder aehnlicher form auch auf anderen gebraeuchlichen shells. zur wiederhohlung: ein file namens blabla.sh mit dem inhalt: #!/bin/bash echo test date kann mit dem befehl: chmod ugo+rx blabla.sh fuer alle lesbar und ausfuehrbargemacht werden und wird z.b. mit: ./blabla.sh gestartet (wenn es im aktuellen verzeichniss liegt) oft will man wissen ob ein bestimmter befehl funktioniert hat oder fehlgeschlagen ist. die meisten sauber geschriebenen befehle geben im fehlerfalle einen fehlercode zurueck. im erfolgsfalle 0. (fuer C programmierer: das ist der return wert der main funktion) das ergebniss des letzten befehls ist in der bash in der variable $? abgelegt. z.b.: ping -c 1 irgendeinrechner.irgendwo.at ; echo das ergebniss ist $? wuerde zuerst das ping ausfuehren (-c 1 sagt nur ein packet schicken). ist der ping erfolgreich gibt das ping kommandeo "0" zurueck. ist der ping nicht geglueckt bekommen wir ein wert ungleich 0. das echo $? gibt diesen wert aus. man kann dieses ergebniss auch in einer if bedinung verwenden: if ping -c 1 irgendeinrechner.irgendwo.at ; then echo der rechner ist erreichbar else echo nicht erreichbar fi die if construction ist in die bash eingebaut. es ruft hier das externe programm ping auf und werte den return code aus. zum testn ist oft praktisch das programm "true" true das immer den wert 0 zurueckliefern. true ; echo $? und das programm "false" false ; echo $? manchmal will man in einem script vergleiche von strings oder zahlen oder vorhandensein von files oder aehnliches abpruefen. dafuer gibt es das kommando "test" (meist auf /usr/bin/test oder /bin/test ) da man test so oft benoetigt hat bash ein eingebautes test (das aufgerufen wird wenn man test ohne pfadangabe aufruft. test 5 -lt 7 ; echo $? -lt im test heisst: less then. der ausdruck ist also wahr (liefert 0 zurueck) wenn die bedinung erfuellt ist. dh. man kann z.b schreiben: let cnt=0 while test $cnt -lt 7 ; do echo counter ist $cnt let cnt=cnt+1 done hier haben wir statt der if bedingung eine while schleife geamcht. der teil zwischen do und done wird so lange ausgefuehrt solange das programm hinter while eine 0 zurueckliefert (d.h. solange die bedingung erfuellt ist) da test so oft gebraucht wir gibt es in der bash noch eine elegantere moeglichkeit es zu verwenden. man kann den ausdruck den man testen will in eckige klammern schreiben: [ 7 -lt 6 ] ; echo $? d.h. z.b: if [ $zaehler -lt 10 ] ; then echo der zaehler ist noch nicht auf zehn ; fi test, /usr/bin/test und [ ] koennen neben arithmetischen vergleichen ( -lt less then. -le less or equal, -ge ... aus strings vergleichen. z.b.: if [ "$USER" = "mond" ] ; then echo guten tag $USER ; fi oder eigenschaften von files ueberprufen. (z.b. deren vorhandensein) if [ -e /var/spool/mail/maxmeier ] ; then echo der user maxmeier hat schon eine mailbox fi genaures dazu in man page und mit help test logische ausdruecke kann man mit UND und ODER verknuepfen. in der bash geht das mit && und || ping -c bla.irgendwo.at && echo bla.irgendwo.at ist erreichbar duie ausgabe bla.irgendwo.at ist erreichbar erfolgt nur wenn das ping erfolgreich war. der trick dabei ist: ist der erste teil einer logischen UND (&&) verknuepfung bereits falsch so ist aufjedenfall der ganze ausdruck falsch. der zweite teil (hier z.b. der echo befehl) braucht dann gar nicht mehr ausgefuehrt zu werden. genau umgekehrt ist es mit || (oder) cd /tmp/bla || mkdir /tmp/bla versucht ein cd /tmp/bla falls dieses fehlschlaegt wird der befehl mkdir /tmp/bla ausgefuehrt.... EXERCISES: * was besagt der return wert eines programmes? welchen wert wird per konvention meisst fuer eine erfolgreiche programmausfuehrung zurueckgeliefert? * wozu kann man den test befehl verwenden? * schreibe ein script das 20 leere files mit dem namen bla1.txt bla2.txt bis bla20.txt anlegt. * schreibe ein script dass etwa alle 60 sekunden einen host anpingt und mitzaehlt wie oft dies erfolgreich ist und nicht. REFERENCES: man bash info bash help test man test help if help while