falls irgendwas nur mit der bash, aber nicht mit der ash laufen sollte, dann als solches kennzeichnen!
Eingaben/Ausgaben
- >DATEI
- Standard-Ausgabe (1) in DATEI schreiben
- 1>DATEI
- dito
- >>DATEI
- Standard-Ausgabe (1) an DATEI anhaengen
- 2>DATEI
- Fehler-Ausgabe (2) in DATEI schreiben
- &>DATEI
- Standard- und Fehlerausgabe in Datei schreiben
- <DATEI
- Standard-Input aus DATEI lesen
- N<DATEI
- DATEI mit dem Datei-Deskriptor Nummer N als nur-lese verknuepfen
- N>DATEI
- DATEI mit dem Datei-Deskriptor Nummer N als nur-schreiben verknuepfen
- N<>DATEI
- DATEI fuer schreib/lese-Zugriffe als Nummer N oeffnen
- N<< TRENNER
- der folgende Text bis zum Auftreten einer Zeile, in der nur TRENNER steht, wird als Eingabestrom verwendet
- N<<- TRENNER
- dito - fuehrende Tabulatoren werden jedoch ignoriert
als DATEI kann auch immer "&N" (mit N als Zahl) verwendet werden, um eine Kopie des entsprechenden Datei-Deskriptors zu verwenden (also "2>&1" lenkt die Fehlerausgabe auf die Standard-Ausgabe um)
"&-" als DATEI schliesst den angegebenen Strom
Befehls-Verkettungen
- ||
- ODER - fuehrt das folgende Kommando nur aus, wenn das erste nicht mit Fehlercode 0 beendet wurde
- &&
- UND - nur, falls das erste Kommando erfolgreich war
- die Kommandos werden nacheinander ausgefuehrt
- &
- das Programm wird im Hintergrund ausgefuehrt
- { BEFEHLE; }
- fuehrt die Befehle in der aktuellen Shell aus (Vorsicht - falls durch eine UND-/ODER-Verknuepfung die schliessende Klammer uebersprungen wird, fuehrt das zu irritierenden Fehlermeldungen)
- (BEFEHLE)
- fuehrt die Befehle in einer neuen Shell aus (also werden keine Variablen der aktuellen Shell veraendert usw.)
Anfuehrungsstriche
- doppelte
- Variablen und rueckwaertige Anfuehrungsstriche (Backticks) werden aufgeloest
- einfache
- beides wird nicht aufgeloest
- rueckwaertige
der Text wird als Kommando interpretiert und liefert dessen Ausgabe zurueck (z.B.: DATEIEN=ls /tmp/)
Strukturen
- while- und for-Schleifen koennen durch "break" beendet und durch "continue" mit der naechsten Iteration fortgesetzt werden
- BEDINGUNG ist ueblicherweise ein Programm, dessen Exit-Code verwendet wird
- falls dazu das builtin "test" verwendet wird, gilt die verkuerzte Schreibweise: "[ TEST_PARAMETER ]"
- BEDINGUNG kann auch eine beliebig lange Liste von Kommandos sein - relevant ist nur der Exit-Code des letzten Befehls
- anstelle der Zeilenumbrueche kannst du natuerlich auch ein Semikolon verwenden
while
while BEDINGUNG do BEFEHL BEFEHL done
until
siehe "while" - einfach "until" stattdessen einsetzen
for
for VAR in LISTE do BEFEHL BEFEHL done
- VAR ist der Name (ohne "$") der Variablen, die das aktuelle Element aus LISTE enthaelt
- dabei solltest du LISTE nicht in Anfuehrungsstriche setzen, damit die einzelnen Parameter nicht als Ganzes interpretiert werden
if
if BEDINGUNG then BEFEHL BEFEHL else BEFEHL BEFEHL fi
case
case $VARIABLE in a|b ) BEFEHL BEFEHL ;; c ) BEFEHL ;; * ) BEFEHL ;; esac
Variablen-Substitution
- ${var}
- die Variable
${var<nowiki>::</nowiki>-default}: falls die Variable nicht gesetzt ist, wird der dafault-Wert zurueckgegeben ${var<nowiki>::</nowiki>=default}: falls die Variable nicht gesetzt ist, wird ihr der default-Wert zugewiesen ${var<nowiki>::</nowiki>?[meldung]}: falls die Variable nicht gestzt ist, wird "meldung" (oder ein Standard-Text) an Standard-Error ausgegeben und das Skript mit Fehlercode beendet - ansonsten wird der Variablenwert zurueckgegeben ${var::+alternative}: falls die Variable gesetzt ist, wird "alternative" zurueckgegeben, ansonsten der Wert der Variable (also null (leer))
Anmerkung zu den vorherigen Beschreibungen:
- "nicht gesetzt" bedeutet eigentlich "nicht gesetzt oder null"
- falls wirklich nur "nicht gesetzt" gemeint ist, dann muss der Doppelpunkt weggelassen werden
- ${#var}
- die Anzahl der Zeichen der Variable
- ${var%regexp}
entfernt das kleinstmoegliche Suffix, fuer das "regexp" zutrifft (aus var=<nowiki>gurgelFressFisch</nowiki> und regexp=F.*$ wird somit "<nowiki>gurgelFress</nowiki>")
- ${var%%regexp}
- entfernt das groesstmoegliche Suffix, fuer das "regexp" zutrifft (das obige Beispiel ergibt dann "gurgel")
- ${var#regexp}
- entfernt das kleinstmoegliche Praefix
- ${var##regexp}
- entfernt das groesstmoegliche Praefix
Berechnungen
mit $((formel)) koennen einfache arithmetische Operationen ausgefuehrt werden
- alle Variablen in der Berechnung muessen mit dem ueblichen Dollarzeichen markiert werden (fuer ash erforderlich - fuer bash nicht)
Vorsicht: i=$(($i+1)) und i=$((i+1)) ist fuer die bash nicht dasselbe - ersteres wird als unendliche Rekursion abgelehnt und letzteres liefert das erwartete Resultat (bei der ash funktioniert nur die erste Variante)
wichtige Shell-Variablen
- $1 .. $9
- die Parameter beim Skript-Aufruf (koennen mit "shift" weitergeschoben werden, um an die folgenden Parameter zu gelangen)
- $0
- der Name des Shell-Skripts
- $*
- alle Parameter der Shell
- $@
- so aehnlich, wie "$*"
- $#
- die Anzahl der Parameter
- $?
- Exit-Code der letzten Pipeline bzw. des letzten (Vordergrund-)Kommandos
- $!
- Exit-Code der letzten Pipeline bzw. des letzten (Hintergrund-)Kommandos
- $$
- die pid des Skripts
wichtige builtins
- . DATEI
- liest DATEI ein und fuehrt die folgenden Zeilen in der aktuellen Shell aus (wichtig, um die Variablen der aktuellen Shell beeinflussen zu koennen)
- eval STRING
- wertet STRING aus und fuehrt die ergebende Zeichenkette aus
- read [-p TEXT] VAR
- gibt eventuell TEXT aus und wartet auf eine Eingabezeile von Standard-Input - diese wird VAR zugewiesen
- set
- Shell-Optionen setzen
- -x
- jede Skript-Zeile (nach Variablenexpansion usw.) ausgeben, bevor sie ausgefuehrt wird
- -u
- falls eine verwendete Variable nicht gesetzt ist, dann beende das Skript mit Fehler (schuetzt vor Tipp-Fehlern)
- -e
Skript sofort abbrechen, falls ein Kommando mit Fehler beendet wurde (gilt nicht fuer test, if, "||"-Verkettungen usw.)
- shift [n]
rueckt die aktuellen Parameter ($1 usw.) um "n" weiter
- test
- RTFM
- trap AKTION SIGNALE
- fuehrt AKTION (in einfachen Anfuehrungsstrichen) aus, wenn das Programm eins der angegebenen Signale empfaengt; die Signale koennen als Zahlen oder per Name angesprochen werden; "0" bedeutet Skript-Ende
- exit [X]
- beendet das Skript und gibt den Exit-Code X (bzw. 0) zurueck
Funktionen
name () BEFEHL
- dabei kann BEFEHL auch eine Liste von Befehlen sein, die durch "{}" eingeschlossen werden
- "return X" liefert den Exit-Code X zurueck
- die Parameter der Funktion sind als "$1" bis "$9" verfuegbar
- der Aufruf einer Funktion startet einen eigenen Prozess
Unterschiede von asb/bash
- die mathematische Auswertung erfordert bei der ash die uebliche Variablenmarkierung mit dem "$", waehrend die bash dies nicht verlangt - allerdings wendet die bash bei Anwesenheit des "$" eine komplexere Logik an, auf dass "i=$(($i+1))" wegen unendlicher Rekursion abgelehnt wird
Bock auf mehr?
Dann geh auf http://freshmeat.net/projects/advancedbashscriptingguide/?branch_id=130&release_id=159084