Einführung in die Bash Luis Kornblueh KlosterCluster Team 2013/2014, Klosterschule May 22, 2014 1 / 17
Inhaltsverzeichnis Einführung in das Scripting Einfache Beispiele Kommandos ersetzen Bedingungen Tests If/Then/Else Argumente Zugriff auf Kommandoargumente 2 / 17
Einführung in das Scripting Was ist ein Script? Definition: Ein Script ist einem Computerprogramm sehr ähnlich. Es kann allerdings nicht von alleine als Programm ablaufen. Shellskripten laufen in einer Kommandoshell wie der bash. Sie werden interpretiert. Scripts werden in Scriptsprachen wie perl, ruby oder python geschrieben. In unserem Fall ist der Scriptspracheninterpreter die bash. 3 / 17
Einführung in das Scripting Der Shebang Alle Shellskripte fangen mit einem shebang (#!) an. Der entweder von dem vollen Pfad zum entsprechenden Interpreter gefolgt wird wie z.b. /bin/bash oder durch /usr/bin/env bash. # This is the beginning of a shell script... Jede Zeile die mit # (mit Ausnahme des shebang) beginnt, ist ein Kommentar. Kommentare werden während der Ausführung ignoriert. Sie sollen den Code nur verständlicher machen! 4 / 17
Einführung in das Scripting Setzen von Variablen Erzeugen und Setzen von Variablen ist einfach: myvar="a new string variable!" Die neue Variable myvar kann nur als $myvar benutzt werden: echo $myvar A new string variable! Beachte, dass keine Leerzeichen links und rechts des Gleichheitszeichens steht das ist ganz wichtig! 5 / 17
Einfache Beispiele Hello World Wir schreiben einen neue Datei nennen wir sie hello.sh: echo Hello World! Nun ändern wir die Benutzerrechte der Datei so, dass sie ausführbar wird: chmod +x hello.sh Nun können wir das erste Shellskript laufen lassen!./hello.sh Hello World! 6 / 17
Einfache Beispiele Hello World - ein wenig anders Nun machen wir es etwas komplizierter und verwenden eine Variable in hello2.sh: STRING= Hello again, world! echo $STRING Wir ändern wieder die Zugriffsrechte und lassen das Script laufen: chmod +x hello2.sh &&./hello2.sh Hello again, world! 7 / 17
Einfache Beispiele Ein Backup-Script Nun folgt ein etwas sinnvolleres Script, das ein Backup deines Documents-Directory macht: tar -czf /backups/backup.tar.gz /Documents/ Dieses Script verwendet das tar Archivierungskommando: Wie macht man Tarballs: tar -cf <dest archive> <source> tar -xf <archive> 8 / 17
Kommandos ersetzen Verwendung der Ausgabe eines Kommanods Um die Ausgabe eines Kommandos nutzen zu können, setzt man das Kommando in Klammern mit vorgestelltem $: $(command) oder in backticks (nicht mehr empfohlen): `command` echo date echo $(date) Die Backtickmethode erfordert zusätzlich ein Escaping des \, ` und $ 9 / 17
Kommandos ersetzen Nocheinmal: das Backup-Script Versuchen wir nun, das Backup-Script ein wenig zu verbessern. Wir wollen unsere alten Backup-Archive nicht überscheiben. tar -cf /backups/docs $(date +%d%b%y).tar.gz /documents/ Heute schreiben wir eine Datei namens docs 21Nov2013.tar Die Manpage für date (man date) ist sehr hilfreich um die Formattierungsangaben zu verstehen. 10 / 17
Bedingungen Tests Ist das ein Test? Ab und zu muss man prüfen, ob eine Bedingung erfüllt ist oder nicht. Wir wollen nun sehen, wie man diese Tests durchführen kann. Testen einer Bedingung Es gibt viele Bedingungsausdrücke, die man in der Shell testen kann. test EXPRESSION [ EXPRESSION ] Diese Kommandos liefern als exit status 0 zurück, wenn die Bedingung wahr ist und andernfalls 1. Hinweis: man kann den exit status des letzten Kommandos der Variable $? entnehmen. 11 / 17
Bedingungen Tests Ausdrücke Das test Kommando hat viele built-in Testausdrücke, die wir benutzen können: Nützliche Testausdrücke Expression liefern wahr, wenn: [! EXPR ] EXPR ist falsch [ EXPR1 -a EXPR2 ] EXPR1 und EXPR2 sind wahr [ EXPR1 -o EXPR2 ] EXPR1 oder EXPR2 ist wahr [ INT1 -(eq/ne) INT2 ] ints sind geleich/ungleich [ INT1 -(gt/lt) INT2 ] INT1 ist größer als/kleiner als INT2 [ -o optionname ] Shelloption optionname ist an [ STR1 == STR2 ] die beiden Strings sind gleich 12 / 17
Bedingungen Tests Dateiabfragen Da häufig Dateien in Scripts gehandhabt werden, gibt es dafür extra Abfragen: Dateitests Expression liefert wahr wenn: [ -e FILE ] Datei existiert [ -r FILE ] existiert und ist lesbar [ -s FILE ] existiert und hat eine Größe > 0 [ -w FILE ] existiert und ist Beschreibbar [ -O FILE ] existiert und gehört dir [ -G FILE ] existiert und gehört deiner Gruppe Es gibt noch viele mehr, die man mit man test finden kann. 13 / 17
Bedingungen If/Then/Else Standard Wenn/Dann Die kompakteste Schreibweise des if Kommandos ist: if TEST-EXPR; then CONDITIONAL-COMMANDS; fi Zunächst wird TEST-EXPR ausgeführt, wenn der exit status wahr ist, wird danach CONDITIONAL-COMMANDS ausgeführt. Sonst, passiert nichts. if [ $? -eq 0 ] then echo Last command exited cleanly! fi 14 / 17
Bedingungen If/Then/Else Wenn/Dann/Sonst Wenn wir zwischen zwei Wegen entscheiden müssen, können wir einen else Zweig einführen: if [ $? -eq 0 ] then echo Last command exited cleanly! else echo Uh-oh - non-zero exit status! fi Beachte: Wenn man mehrere Kommandos in eine Zeile schreiben möchte, muss man sie mit Semikolons trennen. 15 / 17
Bedingungen If/Then/Else In voller Schönheit Beachtet man alles, ergibt sich: if TEST-COMMANDS; then CONSEQUENT-COMMANDS; elif MORE-TEST-COMMANDS; then MORE-CONSEQUENT-COMMANDS; else ALTERNATE-COMMANDS; fi 16 / 17
Argumente Zugriff auf Kommandoargumente Verwendung von Argumenten Wir haben bereits eine Reihe von Kommandos gesehen, bei denen das Verhalten mit Optionen verändert werden kann. Kommandozeilenargumente Das ist wirklich einfach: jedes Argument wird einer Variablen zugewiesen: $1, $2, $3, etc. $0 speichert den Namen des Scripts und $# enthält die Anzahl der Argumente. echo \$1 = $1 Was passiert mit einem zusätzlichen Argument beim Laufenlassen? 17 / 17