IT-Academy Logo
Sign Up Login Help
Home - Betriebssysteme - Unix - Allgemeines - Grundlagen von bash-Skripts



Grundlagen von bash-Skripts

Hier werden die Grundlagen von Skripten erklärt. Wie man sie schreibt, wie man sie ausführt und was Sie für einen Nutzen für uns Anwender haben.


Autor: Franz Schaefer (mond)
Datum: 03-02-2002, 15:02:35
Referenzen: man bash
man test
Schwierigkeit: Anfänger
Ansichten: 15532x
Rating: 8 (1x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Übersicht

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.



_______________________________________________
CD ist ein service von SILVER SERVER
der inhalt unterliegt der GFDL
_______________________________________________



Rolfhub
Senior Member
Beitrag vom:
12-10-2003, 14:38:42

Vorsicht Fallstrick

Bei BASH-Skripten lauert übrigens ein kleiner Fallstrick: Viele UNIX-/Linux-Programme kommen sowohl mit UNIX- als auch mit Windows-Zeilenumbrüchen klar, z. B. hat (meiner Erfahrung nach) der g++ (GNU C++ Compiler) keine Probleme mit Windows-Zeilenumbrüchen, die BASH scheint aber damit Probleme zu haben, hier helfen die Programme "todos" bzw. "fromdos" weiter (Packet "sysutils"). P.S.: Definition Windows-Zeilenumbruch=0x0D0A, UNIX-/Linux-Zeilenumbruch=0x0A.

-----------------------------------------------------


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04508
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06246
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1154
Comments: 0