Bash: Unterschied zwischen den Versionen
| (153 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
| − | = | + | = Nützliche Tastenbefehle = |
| − | + | * [[Bash Shortcuts]] | |
| − | * | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | =Einfache Verzweigungen= | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
In Abhängigkeit vom Returncode eines Befehls oder einer Pipe kann mit den Sonderzeichen ''&&'' und ''||'' eine | In Abhängigkeit vom Returncode eines Befehls oder einer Pipe kann mit den Sonderzeichen ''&&'' und ''||'' eine | ||
Verzweigung durchgeführt werden. | Verzweigung durchgeführt werden. | ||
| − | + | *echo ''das ist sux1.'' > sux1 | |
| − | + | *rm sux1 && echo ''sux1 ist geloescht!'' | |
| − | + | *rm sux1 || echo ''sux1 konnte nicht geloescht werden.'' | |
Der Befehl nach ''&&'' wird dabei nur ausgeführt, wenn der Returncode des vorherigen Befehls oder der vorherigen | Der Befehl nach ''&&'' wird dabei nur ausgeführt, wenn der Returncode des vorherigen Befehls oder der vorherigen | ||
Pipe 0 war, also der Befehl vor der Pipe fehlerfrei ausgeführt wurde. Ist ein Befehl vor einer Pipe nicht erfolgreich | Pipe 0 war, also der Befehl vor der Pipe fehlerfrei ausgeführt wurde. Ist ein Befehl vor einer Pipe nicht erfolgreich | ||
(Returncode != 0), wird der Befehl nach ''||'' ausgeführt. | (Returncode != 0), wird der Befehl nach ''||'' ausgeführt. | ||
| + | * [[Boolsche Algebra]] | ||
| − | + | =Endestatus= | |
| − | + | N:ach der Ausführung eines Befehls wird ein Returncode (Endestatus) zurückgeliefert. Mit Hilfe des Returncodes lässt | |
sich feststellen, ob der letzte Befehl fehlerfrei ausgeführt wurde. | sich feststellen, ob der letzte Befehl fehlerfrei ausgeführt wurde. | ||
Returncode = 0 Letzter Befehl wurde fehlerfrei ausgeführt. | Returncode = 0 Letzter Befehl wurde fehlerfrei ausgeführt. | ||
| Zeile 481: | Zeile 22: | ||
fsck). In der Systemvariablen $? ist der aktuelle Returncode abgelegt und kann vom Benutzer abgefragt werden. | fsck). In der Systemvariablen $? ist der aktuelle Returncode abgelegt und kann vom Benutzer abgefragt werden. | ||
Bsp.: | Bsp.: | ||
| − | + | *fsck asasas | |
| − | + | *echo $? | |
16 | 16 | ||
oder | oder | ||
| − | + | *ping www.xinux.de -w 1 -c 1 > /dev/null 2>&1 | |
| − | + | *ping 172.20.103.2 -w 1 -c 1 > /dev/null 2>&1 | |
| − | + | *echo $? | |
0 | 0 | ||
Erkenntnis: Rechner ist erreichbar | Erkenntnis: Rechner ist erreichbar | ||
| − | + | *ping 172.20.103.99 -w 1 -c 1 > /dev/null 2>&1 | |
| − | + | *echo $? | |
1 | 1 | ||
Erkenntnis: Rechner ist nicht erreichbar | Erkenntnis: Rechner ist nicht erreichbar | ||
| − | + | *touch bohnen | |
| − | + | *rm bohnen 2> /dev/null | |
| − | + | *echo $? | |
0 | 0 | ||
Erkenntnis: Löschen war erfolgreich | Erkenntnis: Löschen war erfolgreich | ||
| − | + | *rm bohnen 2> /dev/null | |
| − | + | *echo $? | |
1 | 1 | ||
Erkenntnis: Löschen war nicht erfolgreich | Erkenntnis: Löschen war nicht erfolgreich | ||
| − | == | + | = Bash-Steuerstrukturen = |
| − | + | * [[Bash if-Block]] | |
| − | + | * [[Bash while Schleife]] | |
| + | * [[Bash until Schleife]] | ||
| + | * [[Bash for Schleife]] | ||
| + | * [[Bash case Block]] | ||
| − | + | = Bash-Skriptbefehle = | |
| + | * [[Bash trap Befehl]] | ||
| + | * [[Bash read Kommando]] | ||
| + | * [[Bash test Kommando]] | ||
| + | * [[Bash getopts]] | ||
| − | + | = Bash-Variablen und Datenverarbeitung = | |
| − | + | * [[Bash Variablen]] | |
| + | * [[Bash Rechnen]] | ||
| + | * [[Bash Here Dokument]] | ||
| − | + | = Bash-Anpassung und -Optionen = | |
| − | + | * [[Bash Farben]] | |
| − | + | * [[Bash printf]] | |
| + | * [[Bash Optionen der Shell]] | ||
| + | * [[Bash Dateien]] | ||
| + | =Bash Basics= | ||
| − | === | + | ==Einfache Shellsonderzeichen== |
| − | + | {| class="wikitable" border="1" cellpadding="2" | |
| − | + | |- | |
| − | + | |; | |
| − | + | |Trenne Kommandos | |
| − | + | |- | |
| − | + | |# | |
| − | | - | + | |Kommentar |
| − | | | + | |- |
| − | |- | + | |& |
| − | | - | + | |Programm im Hintergrund starten |
| − | | | + | |- |
| + | |<nowiki>|</nowiki> | ||
| + | |STDOUT von links wird zu STDIN von rechts | ||
| + | |- | ||
| + | |* | ||
| + | |steht für beliebig viel Zeichen auch 0 | ||
| + | |- | ||
| + | |? | ||
| + | |steht für genau ein Zeichen | ||
| + | |- | ||
| + | |[abc] | ||
| + | |steht für eins der Zeichen in [ ] hier a b oder c | ||
| + | |- | ||
| + | |~ | ||
| + | |das Homeverzeichnis | ||
|- | |- | ||
| − | | | + | |> und >> |
| − | | | + | |leite in Datei um > überschreibe >> hänge an |
|- | |- | ||
| − | | | + | |< |
| − | | | + | |lesen aus Datei |
|- | |- | ||
| − | | | + | |2>&1 |
| − | + | |leite STDERR auf STDOUT | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | | | ||
|- | |- | ||
| − | | | + | |<< ende |
| + | |Lesen aus Datei (Heredokument) | ||
|- | |- | ||
| − | | | + | |{ , , , } |
| + | |Zeichenketten zusammensetzen | ||
|- | |- | ||
| − | | | + | |"..." |
| + | |Entwertung der Sonderzeichen ausser $ ' \ | ||
|- | |- | ||
| − | | | + | |'...' |
| + | |Entwertung sämtlicher Sonderzeichen ausser ' selbst | ||
|- | |- | ||
| − | | | + | |\ |
| − | + | |Entwertung des folgenden Sonderzeichens | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | | | ||
|- | |- | ||
| − | |||
|} | |} | ||
| + | ==Eingabe/Ausgabe== | ||
| + | Standardeingabe (0): Laufende Programme erwarten von hier ihre Eingaben (normalerweise handelt es sich um die Tastatur). | ||
| − | + | Standardausgabe (1): Programme schreiben auf diese ihre Ausgaben (Bildschirm). | |
| − | |||
| − | |||
| − | + | Standardfehlerausgabe (2) : Fehlerausgaben landen hier (Bildschirm, aber nur die aktive Konsole). | |
| − | |||
| − | + | [[Bild:std.jpg]] | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | ==Umleitungen== | |
| − | + | ;cat | |
| − | + | Das Programm cat liest von STDIN und gibt es STDOUT wieder aus, solange bis das EOF Zeichen kommt. | |
| + | *cat | ||
| + | bla bla | ||
| + | bla bla | ||
| − | + | Einlesen der Datei dat | |
| + | *cat < dat | ||
| + | wichtig | ||
| + | Schreiben in die Datei dat, dies überschreibt den bisherigen Inhalt der Datei | ||
| + | *cat > dat | ||
| + | sogar noch wichtiger | ||
| + | |||
| + | Ausgeben der Datei text | ||
| + | *cat dat | ||
| + | sogar noch wichtiger | ||
| − | + | Lesen aus der Datei dat und schreiben in die Datei neuedat | |
| − | + | *cat < dat > neuedat | |
| + | *cat < neuedat | ||
| + | sogar noch wichtiger | ||
| − | + | Anhängen der Ausgabe von date an die Datei neuedat | |
| − | + | *date >> neuedat | |
| − | + | *cat neuedat | |
| − | + | sogar noch wichtiger | |
| − | + | Do 18. Jun 14:08:58 CEST 2009 | |
| − | |||
| − | |||
| − | |||
| − | + | Umleiten des Standardfehlerkanals nach error | |
| − | + | *rm sux 2> error | |
| − | + | *more error | |
| − | + | Entfernen von „sux“ nicht möglich: No such file or directory | |
| − | + | Zusammenlegen von Standardausgabe und des Standardfehlerkanals | |
| − | + | *touch tux | |
| − | + | *rm -v sux tux > aus-err 2>&1 | |
| − | + | *cat < aus-err | |
| − | + | rm: Entfernen von „sux“ nicht möglich: No such file or directory | |
| − | + | „tux“ entfernt | |
| − | |||
| − | + | ==Nacheinander auszuführende Kommandos== | |
| − | + | *pwd; date | |
| − | + | /root | |
| − | + | Do 18. Jun 14:13:05 CEST 2009 | |
| − | == | + | |
| − | + | Verknüpfung von cat und wc | |
| − | + | *cat < aus-err | wc -l | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
2 | 2 | ||
| − | |||
| − | |||
| − | + | Übergeben der Ausgabe von tail als Eingabe von grep mit Hilfe der Pipe "|" | |
| − | + | *tail /var/log/auth.log | grep xinux | |
| − | + | Jun 18 13:52:33 zero nss_wins[11433]: pam_unix(login:session): session closed for user xinux | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | Übergeben der letzten 100 Zeilen von syslog als Eingabe von grep | |
| − | + | *tail /var/log/syslog -n 100 | grep error | |
| − | + | Jun 18 09:30:54 zero kernel: [154384.692135] end_request: I/O error, dev fd0, sector 0 | |
| − | + | Jun 18 09:30:54 zero kernel: [154384.712137] end_request: I/O error, dev fd0, sector 0 | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | Mit der | + | ==Jokerzeichen in der Shell== |
| + | *mkdir test | ||
| + | *cd test/ | ||
| + | *touch a ab abc abcd abcd b cd efg haij | ||
| + | Ein * steht für jedes Zeichen beliebig oft | ||
| + | *ls * | ||
| + | a ab abc abcd b cd efg haij | ||
| + | *ls ab* | ||
| + | ab abc abcd | ||
| + | Ein ? steht für ein Zeichen | ||
| + | *ls ? | ||
| + | a b | ||
| + | *ls ?? | ||
| + | ab cd | ||
| + | *ls ???* | ||
| + | abc abcd efg haij | ||
| + | Eine [] steht genau für ein Zeichen das in der Klammer ist | ||
| + | *ls [ab] | ||
| + | a b | ||
| + | *ls [abc]? | ||
| + | ab cd | ||
| + | Eine [!] steht genau für ein Zeichen das nicht in der Klammer ist | ||
| + | *ls [!abc]* | ||
| + | efg haij | ||
| + | Mit der {element1,element2} kann man Dateinamen generieren | ||
| + | *mkdir -v dir{1,2,3,4,5,6} | ||
| + | mkdir: Verzeichnis „dir1“ angelegt | ||
| + | mkdir: Verzeichnis „dir2“ angelegt | ||
| + | mkdir: Verzeichnis „dir3“ angelegt | ||
| + | mkdir: Verzeichnis „dir4“ angelegt | ||
| + | mkdir: Verzeichnis „dir5“ angelegt | ||
| + | mkdir: Verzeichnis „dir6“ angelegt | ||
| + | Backup mit Dateinamengenerierung | ||
| + | cp -v xx{,.save} | ||
| − | + | Wenn kein Treffer erfolgt wird das Sonderzeichen eingesetzt | |
| − | + | *rm -r * | |
| − | + | *mkdir -v * | |
| − | + | mkdir: Verzeichnis „*“ angelegt | |
| − | + | *cd *t/*$ | |
| − | + | Entwerten kann man ein Sonderzeichen mit einem \ | |
| − | + | *rm -rvi \* | |
| − | + | rm: Verzeichnis „*“ entfernen? n | |
| + | Entwerten kann man mehrereSonderzeichen mit "" | ||
| + | *rm -rvi "*" | ||
| + | rm: Verzeichnis „*“ entfernen? n | ||
| + | Entwerten kann man mehrereSonderzeichen mit '' | ||
| + | *rm -rvi '*' | ||
| + | rm: Verzeichnis „*“ entfernen? n | ||
| − | + | =Prinzip der Bash= | |
| + | Auf der Konsole werden die Befehle aneinander gereiht, indem zwischen den Befehlen ein ; eingefügt wird. | ||
| + | *date ; hostname ; pwd | ||
| + | Mon Dec 15 08:59:13 CET 2003 | ||
| + | dozent | ||
| + | /home/thomas | ||
| + | Neben dieser interaktiven Eingabe gibt es auch die Möglichkeit, dass die Shell die Kommandos aus einer | ||
| + | Datei lesen kann. | ||
| − | + | Der Inhalt eines (z.B. mit dem vi erstellten) Shellskriptes: | |
| − | + | *cat skript | |
| + | date | ||
| + | hostname | ||
| + | pwd | ||
| − | thomas | + | =Die Ausgabe des Shellskriptes= |
| − | + | *./skript | |
| + | Mon Dec 15 09:07:22 CET 2003 | ||
| + | dozent | ||
| + | /home/thomas/bin | ||
| − | = | + | =Struktogramm nach Nassi-Shneiderman= |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| + | {| border=1 cellpadding="2" | ||
| + | |- | ||
| + | | Ausgabe Datum | ||
| + | |- | ||
| + | | Ausgabe Rechnername | ||
| + | |- | ||
| + | | Ausgabe Arbeitszverzeichnis | ||
| + | |} | ||
| − | + | =Interpretator= | |
| − | + | *[[Bash Interpretator]] | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | = Besondere Dateien und Verzeichnisse = | |
| + | * Links zu weiteren Informationen über besondere Dateien und Systemvariablen: | ||
| + | ** [[Bash Dateien]] | ||
| + | ** [[Bash Wichtige Systemvariablen (Auswahl)]] | ||
| + | ** [[Bash Stellungsparameter]] | ||
| − | + | =Steuerung der Ablaufanweisungen= | |
| − | + | *[[Bash Ablaufanweisungen]] | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | =Select= | |
| − | + | Mit dem Befehl bash select können verschiedene Arten von Menüerstellungsaufgaben, das Erstellen einer menübasierten Listen, das Erstellen eines Menüs aus Dateiinhalten usw. ausgeführt werden. | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | = | + | <syntaxhighlight lang=bash> |
| − | + | #!/bin/bash | |
| − | / | + | select auswahl in Punkt1 Punkt2 Punkt3 Punkt4 |
| + | do | ||
| + | echo "Ihre Auswahl war : $auswahl" | ||
| + | done | ||
| + | </syntaxhighlight> | ||
| − | + | <syntaxhighlight lang=bash> | |
| − | + | #!/bin/bash | |
| − | + | PS3="Datei zum Editieren auswählen : " | |
| − | + | select AUSWAHL in *.sh exit | |
| − | + | do | |
| + | case "$AUSWAHL" in | ||
| + | exit) | ||
| + | echo "exit" | ||
| + | break | ||
| + | ;; | ||
| + | "") | ||
| + | echo "$REPLY: Ungültige Auswahl" | ||
| + | ;; | ||
| + | *) | ||
| + | if [ -d "$AUSWAHL" ] | ||
| + | then | ||
| + | echo "Verzeichnis kann nicht editiert werden" | ||
| + | continue | ||
| + | else | ||
| + | $EDITOR $AUSWAHL | ||
| + | fi | ||
| + | break | ||
| + | ;; | ||
| + | esac | ||
| + | done | ||
| + | </syntaxhighlight> | ||
| − | + | ==break n== | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
Die aktuelle Schleife wird abgebrochen, danach wird mit der ersten Anweisung nach der Schleife weitergemacht. Bei | Die aktuelle Schleife wird abgebrochen, danach wird mit der ersten Anweisung nach der Schleife weitergemacht. Bei | ||
Verschachtelungen wird auf der n-ten Schleifenebene aufgesetzt. | Verschachtelungen wird auf der n-ten Schleifenebene aufgesetzt. | ||
| Zeile 963: | Zeile 336: | ||
Programme unleserlich und schwer kontrollierbar. Daher ist eine sparsame Verwendung empfehlenswert. | Programme unleserlich und schwer kontrollierbar. Daher ist eine sparsame Verwendung empfehlenswert. | ||
| − | + | <syntaxhighlight lang=bash> | |
| − | + | #!/bin/bash | |
| − | + | while true | |
do | do | ||
| − | + | test -f /tmp/sux && break | |
| − | + | echo "unn weiter" | |
| − | + | sleep 3 | |
done | done | ||
echo "und tschuess" | echo "und tschuess" | ||
| + | </syntaxhighlight> | ||
| − | + | =Funktionen= | |
| − | + | [[bash funktion]] | |
| − | |||
| − | |||
| − | + | =Signalbehandlung= | |
| − | + | ==Signale bei der Programmierung der bash== | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
Es existieren verschiedene Möglichkeiten, auf welchem Wege Signale gesendet werden können: | Es existieren verschiedene Möglichkeiten, auf welchem Wege Signale gesendet werden können: | ||
| Zeile 1.051: | Zeile 387: | ||
|} | |} | ||
| − | + | ==Reaktion eines Prozesses auf den Empfang eines Signals== | |
* Der Prozess beendet sich (meist Standardeinstellung). | * Der Prozess beendet sich (meist Standardeinstellung). | ||
* Der Prozess ignoriert das Signal. (Ausnahme: SIGKILL) | * Der Prozess ignoriert das Signal. (Ausnahme: SIGKILL) | ||
* Der Prozess fängt das Signal ab, d.h. er leitet eine selbst definierte Reaktion ein. | * Der Prozess fängt das Signal ab, d.h. er leitet eine selbst definierte Reaktion ein. | ||
| − | + | =Weitere Möglichkeiten der Bash-Shell= | |
| − | + | ==Alias-Namen== | |
| − | + | *[[aliase]] | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | = | + | =Filedeskriptoren= |
| + | *[[Bash Filedeskriptoren]] | ||
| + | = Aufgaben = | ||
| + | * [[Bash Youtube Abo]] | ||
| − | + | =Links= | |
| − | + | *http://openbook.rheinwerk-verlag.de/shell_programmierung/ | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | = | ||
| − | *http://openbook. | ||
| − | |||
| − | |||
*http://mywiki.wooledge.org/BashFAQ/031 | *http://mywiki.wooledge.org/BashFAQ/031 | ||
| − | + | *http://tldp.org/LDP/abs/html/index.html | |
| − | + | *http://openbook.rheinwerk-verlag.de/shell_programmierung/shell_006_003.htm | |
| − | + | *https://kuepper.userweb.mwn.de/informatik/printf.pdf | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
Aktuelle Version vom 20. Juni 2024, 02:08 Uhr
Nützliche Tastenbefehle
Einfache Verzweigungen
In Abhängigkeit vom Returncode eines Befehls oder einer Pipe kann mit den Sonderzeichen && und || eine Verzweigung durchgeführt werden.
- echo das ist sux1. > sux1
- rm sux1 && echo sux1 ist geloescht!
- rm sux1 || echo sux1 konnte nicht geloescht werden.
Der Befehl nach && wird dabei nur ausgeführt, wenn der Returncode des vorherigen Befehls oder der vorherigen Pipe 0 war, also der Befehl vor der Pipe fehlerfrei ausgeführt wurde. Ist ein Befehl vor einer Pipe nicht erfolgreich (Returncode != 0), wird der Befehl nach || ausgeführt.
Endestatus
N:ach der Ausführung eines Befehls wird ein Returncode (Endestatus) zurückgeliefert. Mit Hilfe des Returncodes lässt sich feststellen, ob der letzte Befehl fehlerfrei ausgeführt wurde.
Returncode = 0 Letzter Befehl wurde fehlerfrei ausgeführt. Returncode ≠ 0 Letzter Befehl wurde nicht fehlerfrei ausgeführt.
Das Kommando true liefert den Returncode 0, false liefert den Returncode ≠ 0 . Bei einigen Befehlen wird die zurückgelieferte Fehlermeldung (Returncode ≠ 0) noch weiter differenziert (siehe man fsck). In der Systemvariablen $? ist der aktuelle Returncode abgelegt und kann vom Benutzer abgefragt werden. Bsp.:
- fsck asasas
- echo $?
16
oder
- ping www.xinux.de -w 1 -c 1 > /dev/null 2>&1
- ping 172.20.103.2 -w 1 -c 1 > /dev/null 2>&1
- echo $?
0
Erkenntnis: Rechner ist erreichbar
- ping 172.20.103.99 -w 1 -c 1 > /dev/null 2>&1
- echo $?
1
Erkenntnis: Rechner ist nicht erreichbar
- touch bohnen
- rm bohnen 2> /dev/null
- echo $?
0
Erkenntnis: Löschen war erfolgreich
- rm bohnen 2> /dev/null
- echo $?
1
Erkenntnis: Löschen war nicht erfolgreich
Bash-Steuerstrukturen
Bash-Skriptbefehle
Bash-Variablen und Datenverarbeitung
Bash-Anpassung und -Optionen
Bash Basics
Einfache Shellsonderzeichen
| ; | Trenne Kommandos |
| # | Kommentar |
| & | Programm im Hintergrund starten |
| | | STDOUT von links wird zu STDIN von rechts |
| * | steht für beliebig viel Zeichen auch 0 |
| ? | steht für genau ein Zeichen |
| [abc] | steht für eins der Zeichen in [ ] hier a b oder c |
| ~ | das Homeverzeichnis |
| > und >> | leite in Datei um > überschreibe >> hänge an |
| < | lesen aus Datei |
| 2>&1 | leite STDERR auf STDOUT |
| << ende | Lesen aus Datei (Heredokument) |
| { , , , } | Zeichenketten zusammensetzen |
| "..." | Entwertung der Sonderzeichen ausser $ ' \ |
| '...' | Entwertung sämtlicher Sonderzeichen ausser ' selbst |
| \ | Entwertung des folgenden Sonderzeichens |
Eingabe/Ausgabe
Standardeingabe (0): Laufende Programme erwarten von hier ihre Eingaben (normalerweise handelt es sich um die Tastatur).
Standardausgabe (1): Programme schreiben auf diese ihre Ausgaben (Bildschirm).
Standardfehlerausgabe (2) : Fehlerausgaben landen hier (Bildschirm, aber nur die aktive Konsole).
Umleitungen
- cat
Das Programm cat liest von STDIN und gibt es STDOUT wieder aus, solange bis das EOF Zeichen kommt.
- cat
bla bla bla bla
Einlesen der Datei dat
- cat < dat
wichtig
Schreiben in die Datei dat, dies überschreibt den bisherigen Inhalt der Datei
- cat > dat
sogar noch wichtiger
Ausgeben der Datei text
- cat dat
sogar noch wichtiger
Lesen aus der Datei dat und schreiben in die Datei neuedat
- cat < dat > neuedat
- cat < neuedat
sogar noch wichtiger
Anhängen der Ausgabe von date an die Datei neuedat
- date >> neuedat
- cat neuedat
sogar noch wichtiger Do 18. Jun 14:08:58 CEST 2009
Umleiten des Standardfehlerkanals nach error
- rm sux 2> error
- more error
Entfernen von „sux“ nicht möglich: No such file or directory
Zusammenlegen von Standardausgabe und des Standardfehlerkanals
- touch tux
- rm -v sux tux > aus-err 2>&1
- cat < aus-err
rm: Entfernen von „sux“ nicht möglich: No such file or directory „tux“ entfernt
Nacheinander auszuführende Kommandos
- pwd; date
/root Do 18. Jun 14:13:05 CEST 2009
Verknüpfung von cat und wc
- cat < aus-err | wc -l
2
Übergeben der Ausgabe von tail als Eingabe von grep mit Hilfe der Pipe "|"
- tail /var/log/auth.log | grep xinux
Jun 18 13:52:33 zero nss_wins[11433]: pam_unix(login:session): session closed for user xinux
Übergeben der letzten 100 Zeilen von syslog als Eingabe von grep
- tail /var/log/syslog -n 100 | grep error
Jun 18 09:30:54 zero kernel: [154384.692135] end_request: I/O error, dev fd0, sector 0 Jun 18 09:30:54 zero kernel: [154384.712137] end_request: I/O error, dev fd0, sector 0
Jokerzeichen in der Shell
- mkdir test
- cd test/
- touch a ab abc abcd abcd b cd efg haij
Ein * steht für jedes Zeichen beliebig oft
- ls *
a ab abc abcd b cd efg haij
- ls ab*
ab abc abcd
Ein ? steht für ein Zeichen
- ls ?
a b
- ls ??
ab cd
- ls ???*
abc abcd efg haij
Eine [] steht genau für ein Zeichen das in der Klammer ist
- ls [ab]
a b
- ls [abc]?
ab cd
Eine [!] steht genau für ein Zeichen das nicht in der Klammer ist
- ls [!abc]*
efg haij
Mit der {element1,element2} kann man Dateinamen generieren
- mkdir -v dir{1,2,3,4,5,6}
mkdir: Verzeichnis „dir1“ angelegt mkdir: Verzeichnis „dir2“ angelegt mkdir: Verzeichnis „dir3“ angelegt mkdir: Verzeichnis „dir4“ angelegt mkdir: Verzeichnis „dir5“ angelegt mkdir: Verzeichnis „dir6“ angelegt
Backup mit Dateinamengenerierung
cp -v xx{,.save}
Wenn kein Treffer erfolgt wird das Sonderzeichen eingesetzt
- rm -r *
- mkdir -v *
mkdir: Verzeichnis „*“ angelegt
- cd *t/*$
Entwerten kann man ein Sonderzeichen mit einem \
- rm -rvi \*
rm: Verzeichnis „*“ entfernen? n
Entwerten kann man mehrereSonderzeichen mit ""
- rm -rvi "*"
rm: Verzeichnis „*“ entfernen? n
Entwerten kann man mehrereSonderzeichen mit
- rm -rvi '*'
rm: Verzeichnis „*“ entfernen? n
Prinzip der Bash
Auf der Konsole werden die Befehle aneinander gereiht, indem zwischen den Befehlen ein ; eingefügt wird.
- date ; hostname ; pwd
Mon Dec 15 08:59:13 CET 2003 dozent /home/thomas
Neben dieser interaktiven Eingabe gibt es auch die Möglichkeit, dass die Shell die Kommandos aus einer Datei lesen kann.
Der Inhalt eines (z.B. mit dem vi erstellten) Shellskriptes:
- cat skript
date hostname pwd
Die Ausgabe des Shellskriptes
- ./skript
Mon Dec 15 09:07:22 CET 2003 dozent /home/thomas/bin
Struktogramm nach Nassi-Shneiderman
| Ausgabe Datum |
| Ausgabe Rechnername |
| Ausgabe Arbeitszverzeichnis |
Interpretator
Besondere Dateien und Verzeichnisse
- Links zu weiteren Informationen über besondere Dateien und Systemvariablen:
Steuerung der Ablaufanweisungen
Select
Mit dem Befehl bash select können verschiedene Arten von Menüerstellungsaufgaben, das Erstellen einer menübasierten Listen, das Erstellen eines Menüs aus Dateiinhalten usw. ausgeführt werden.
#!/bin/bash
select auswahl in Punkt1 Punkt2 Punkt3 Punkt4
do
echo "Ihre Auswahl war : $auswahl"
done
#!/bin/bash
PS3="Datei zum Editieren auswählen : "
select AUSWAHL in *.sh exit
do
case "$AUSWAHL" in
exit)
echo "exit"
break
;;
"")
echo "$REPLY: Ungültige Auswahl"
;;
*)
if [ -d "$AUSWAHL" ]
then
echo "Verzeichnis kann nicht editiert werden"
continue
else
$EDITOR $AUSWAHL
fi
break
;;
esac
done
break n
Die aktuelle Schleife wird abgebrochen, danach wird mit der ersten Anweisung nach der Schleife weitergemacht. Bei Verschachtelungen wird auf der n-ten Schleifenebene aufgesetzt.
Anmerkung: Ein sinnvoller Einsatz dieser Konstrukte liegt in der Behandlung von Ausnahmen (Fehler). Intensiver Einsatz macht die Programme unleserlich und schwer kontrollierbar. Daher ist eine sparsame Verwendung empfehlenswert.
#!/bin/bash
while true
do
test -f /tmp/sux && break
echo "unn weiter"
sleep 3
done
echo "und tschuess"
Funktionen
Signalbehandlung
Signale bei der Programmierung der bash
Es existieren verschiedene Möglichkeiten, auf welchem Wege Signale gesendet werden können:
- von aussen:
- Benutzer (< DEL >, < CTRL >|, etc.)
- Prozesse (kill, alarm)
- von innen:
- Programmfehler (Adressfehler, ungültiger Befehl, Division durch 0, etc.)
Signale dienen der Interprozesskommunikation. Diese Nachrichten beschränken sich allerdings auf die Übertragung eines einzigen Wertes.
Von den Befehlen trap und kill werden folgende Signale verwendet:
| Signalnummer | Bedeutung |
|---|---|
| 0 | Beenden von bash |
| SIGHUP 1 | Logoff von einer Datensichtstation |
| SIGINT 2 | Drücken der Taste < DEL > |
| SIGQUIT 3 | Drücken der Taste < CTRL > + c |
| SIGKILL 9 | kill: unbedingter Prozessabbruch |
| SIGTERM 15 | Programmbeendigung |
Reaktion eines Prozesses auf den Empfang eines Signals
- Der Prozess beendet sich (meist Standardeinstellung).
- Der Prozess ignoriert das Signal. (Ausnahme: SIGKILL)
- Der Prozess fängt das Signal ab, d.h. er leitet eine selbst definierte Reaktion ein.
