Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
Shell-Programmierung von Jürgen Wolf
Einführung, Praxis, Referenz
Buch: Shell-Programmierung

Shell-Programmierung
782 S., mit CD, 44,90 Euro
Rheinwerk Computing
ISBN 3-89842-683-1
gp Kapitel 1 Einführung
  gp 1.1 Voraussetzungen an den Leser
    gp 1.1.1 Zielgruppe
    gp 1.1.2 Notation
  gp 1.2 Was ist eine Shell?
  gp 1.3 Hauptanwendungsgebiet
    gp 1.3.1 Was ist ein Shellscript?
    gp 1.3.2 Vergleich mit anderen Sprachen
  gp 1.4 Kommando, Programm oder Shellscript?
    gp 1.4.1 Shell-eigene Kommandos (Builtin-Kommando)
    gp 1.4.2 Aliase in der Shell
    gp 1.4.3 Funktionen in der Shell
    gp 1.4.4 Shellscripts (Shell-Prozeduren)
    gp 1.4.5 Programme (binär)
  gp 1.5 Die Shell-Vielfalt
    gp 1.5.1 ksh (Korn-Shell)
    gp 1.5.2 Bash (Bourne-Again-Shell)
    gp 1.5.3 zsh (Z-Shell)
    gp 1.5.4 ash (A-Shell)
    gp 1.5.5 rbash, rzsh (Restricted Shell)
    gp 1.5.6 tcsh (TC-Shell)
    gp 1.5.7 Welche Shell-Variante wird in diesem Buch verwendet?
    gp 1.5.8 rsh und ssh
  gp 1.6 Betriebssysteme
  gp 1.7 Crashkurs: einfacher Umgang mit der Kommandozeile
    gp 1.7.1 Grundlegende Befehle
    gp 1.7.2 Der Umgang mit Dateien
    gp 1.7.3 Der Umgang mit Verzeichnissen
    gp 1.7.4 Datei- und Verzeichnisnamen
    gp 1.7.5 Gerätenamen
    gp 1.7.6 Dateiattribute
  gp 1.8 Shellscripts schreiben und ausführen
    gp 1.8.1 Der Editor
    gp 1.8.2 Der Name des Shellscripts
    gp 1.8.3 Ausführen
    gp 1.8.4 Hintergrundprozess starten
    gp 1.8.5 Ausführende Shell festlegen
    gp 1.8.6 Kommentare
    gp 1.8.7 Stil
    gp 1.8.8 Ein Shellscript beenden
    gp 1.8.9 Testen und Debuggen von Shellscripts
    gp 1.8.10 Shellscript, das ein Shellscript erstellt und ausführt
  gp 1.9 Vom Shellscript zum Prozess
    gp 1.9.1 Ist das Shellscript ein Prozess?
    gp 1.9.2 Echte Login-Shell?
  gp 1.10 Datenstrom
    gp 1.10.1 Ausgabe umleiten
    gp 1.10.2 Standardfehlerausgabe umleiten
    gp 1.10.3 Eingabe umleiten
    gp 1.10.4 Pipes
    gp 1.10.5 Ein T-Stück mit tee
    gp 1.10.6 Ersatzmuster (Wildcards)
    gp 1.10.7 Brace Extension (Bash und Korn-Shell only)
    gp 1.10.8 Muster-Alternativen (Bash und Korn-Shell only)
    gp 1.10.9 Tilde-Expansion (Bash und Korn-Shell only)
  gp 1.11 Empfehlung


Rheinwerk Computing

1.10 Datenstrom  downtop

Den standardmäßigen Datenstrom einer Shell kennt jeder. Man gibt einen Befehl in der Kommandozeile ein und wartet, was dabei auf der Ausgabe des Bildschirms so alles passiert (siehe Abbildung 1.1). Hierbei spricht man von Kanälen. Es gibt drei solcher Kanäle in einer Shell:

gp  Standardeingabe (kurz stdin; Kanal 0) – gewöhnlich handelt es sich dabei um eine Eingabe von der Tastatur.
gp  Standardausgabe (kurz stdout; Kanal 1) – als Standardausgabe wird normalerweise die Ausgabe auf dem Bildschirm bezeichnet.
gp  Standardfehlerausgabe (kurz stderr; Kanal 2) – wie bei der Standardausgabe erfolgt auch die Fehlerausgabe in der Regel auf dem Bildschirm.

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 1.1   Der standardmäßige Datenstrom einer Shell

Relativ selten will man allerdings eine Ausgabe auf dem Bildschirm erzeugen. Gerade wenn es sich dabei um Hunderte Zeilen von Log-Daten handelt, speichert man dies gern in eine Datei ab. Dies realisiert man am einfachsten mit der Umleitung der Ausgabe.


Rheinwerk Computing

1.10.1 Ausgabe umleiten  downtop

Die Standardausgabe eines Kommandos oder eines Shellscripts wird mit dem Zeichen > hinter dem Kommando bzw. Shellscript in eine Datei umgeleitet. Alternativ kann hierfür auch der Kanal 1 mit der Syntax 1> verwendet werden, was aber nicht nötig ist, da das Umleitungszeichen > ohne sonstige Angaben automatisch in der Standardausgabe endet, beispielsweise:

you@host > du -b /home > home_size.dat
you@host > ./ascript > output_of_ascript.dat

Mit du –b /home erfahren Sie, wie viele Bytes die einzelnen Ordner im Verzeichnis /home belegen. Da die Ausgabe relativ lang werden kann, wird diese kurzum in eine Datei namens home_size.dat umgeleitet, welche Sie jetzt mit einem beliebigen Texteditor ansehen können. Sofern diese Datei noch nicht existiert, wird sie neu erzeugt. Gleiches wurde bei der zweiten Kommandoeingabe vorgenommen. Hier wird davon ausgegangen, dass ein Script namens ascript existiert, und die Daten dieses Scripts werden in eine Datei namens output_of_ascript.dat geschrieben (siehe Abbildung 1.2).

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 1.2   Umleiten der Standardausgabe (cmd > datei)

Wie bereits erwähnt, könnten Sie theoretisch den Standardausgabekanal auch bei der Nummer ansprechen:

you@host > du -b /home 1> home_size.dat

Diese Schreibweise hat allerdings gegenüber dem > allein keinen Vorteil.

Leider hat dieses Umleiten einer Ausgabe in eine Datei den Nachteil, dass bei einem erneuten Aufruf von

you@host > du -b /home > home_size.dat

die Daten gnadenlos überschrieben werden. Abhilfe schafft hier eine Ausgabeumleitung mit >>. Damit wird die Ausgabe wie gehabt in eine entsprechende Datei umgeleitet, nur mit dem Unterschied, dass jetzt die Daten immer ans Ende der Datei angehängt werden. Existiert die Datei noch nicht, wird diese trotzdem neu erzeugt.

you@host > du -b /home >> home_size.dat

Jetzt werden die weiteren Daten immer ans Ende von home_size.dat angefügt.


Rheinwerk Computing

1.10.2 Standardfehlerausgabe umleiten  downtop

So, wie Sie die Standardausgabe umleiten können, können Sie auch die Standardfehlerausgabe umleiten. Etwas Ähnliches konnten Sie ja bereits ein paar Seiten zuvor mit

you@host > find / -user you -print 2>/dev/null

sehen. Hiermit wurden alle Dateien vom User »you« auf den Bildschirm ausgegeben. Fehlermeldungen wie bspw. »Keine Berechtigung« wurden hier gewöhnlich auf die Standardfehlerausgabe geleitet. Diese Ausgabe wurde im Beispiel nach /dev/null, dem Datengrab des Systems, umgeleitet.


Hinweis /dev/null eignet sich prima, wenn Sie beispielsweise Daten für einen Test kopieren wollen oder nicht an der Ausgabe interessiert sind. Diese Gerätedatei benötigt außerdem keinen Plattenplatz auf dem System.


Natürlich können Sie auch hierbei die komplette Standardfehlerausgabe (zu erkennen an der Syntax 2> (Kanal 2)) von einem Befehl oder auch einem Script in eine Datei umleiten:

you@host > find / -user you -print 2> error_find_you.dat

Hiermit werden alle Fehlermeldungen in die Datei error_find_you.dat geschrieben. Existiert diese Datei noch nicht, wird sie angelegt. Sofern diese Datei allerdings präsent ist, wird der alte Inhalt in dieser Form komplett überschrieben. Wenn Sie dies nicht wollen, können Sie so wie schon bei der Standardausgabe mit >>, nur eben mit dem Kanal 2, die Standardfehlerausgabe an eine bestehende Datei anhängen (siehe Abbildung 1.3).

you@host > find / -user you -print 2>> error_find_you.dat

Sie können die Standardausgabe und Standardfehlerausgabe auch in zwei verschiedene Dateien umleiten. Dies wird recht häufig gemacht, denn oft hat man nicht die Zeit bzw. Übersicht, sämtliche Ausgaben zu überwachen (siehe Abbildung 1.4).

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 1.3   Umleiten der Standardfehlerausgabe (cmd 2> datei)

you@host > find / -user you -print >> find_you.dat 2>> \
  error_find_you.dat

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 1.4   Beide Ausgabekanäle in eine separate Datei umleiten

Wollen Sie hingegen beides, also sowohl die Standardausgabe als auch die Standardfehlerausgabe in eine Datei schreiben, dann können Sie die beiden Kanäle zusammenkoppeln. Dies erledigen Sie mit der Syntax 2>&1. Damit legen Sie Kanal 2 (Standardfehlerkanal) und Kanal 1 (Standardausgabe) zusammen. Angewandt auf unser Beispiel, sieht dies folgendermaßen aus:

you@host > find / -user you -print > find_you_report.dat 2>&1

So können Sie übrigens auch ein Problem mit dem Pager (less, more ...) Ihrer Wahl lösen. Testen Sie einfach Folgendes:

you@host > find / -user you -print | more

Gewöhnlich verwendet man ja einen Pager (im Beispiel more), um die Standardausgabe komfortabel nach oben oder unten zu scrollen, damit einem bei etwas längeren Ausgaben die Texte nicht nur so vorbeifliegen. Aber hier will das nicht so recht hinhauen, da ständig die Standardfehlerausgabe mit einer Fehlermeldung dazwischen funkt. Dies bekommen Sie einfach in den Griff, indem Sie die beiden Ausgaben zusammenlegen.

you@host > find / -user you -print 2>&1 | more

Alternativ können Sie auch die Standardfehlerausgabe ins Datengrab (/dev/null) befördern.

you@host > find / -user you -print 2>/dev/null | more

Rheinwerk Computing

1.10.3 Eingabe umleiten  downtop

Das Umleiten der Standardeingabe (Kanal 0), das normalerweise von der Tastatur aus erfolgt, kann ebenfalls erreicht werden. Hier wird das Zeichen < nach einem Befehl bzw. einem Script verwendet. Nehmen wir einfach das Beispiel, in dem es darum ging, alle Dateien vom Eigentümer »you« zu suchen und diese in die Datei find_tot.dat zu schreiben. Wahrscheinlich befinden sich hier unendlich viele Dateien, und Sie sind auf der Suche nach einer bestimmten Datei, deren Namen Sie aber nicht mehr genau wissen. War es irgendetwas mit »audio«? Fragen Sie einfach grep:

you@host > grep audio < find_tot.dat
/dev/audio
/dev/audio0
/dev/audio1
/dev/audio2
/dev/audio3
/home/tot/cd2audio.txt
/home/you/cd2audio.txt
/home/you/Documents/Claudio.dat
/var/audio
/var/audio/audio.txt

Hier schieben wir grep einfach die Datei find_tot.dat von der Standardeingabe zu und werden fündig (siehe Abbildung 1.5).

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 1.5   Umleiten der Standardeingabe (cmd < datei)

Wollen Sie die Ausgabe von grep in eine andere Datei speichern, dann können Sie auch noch eine Umleitung der Standardausgabe einbauen.

you@host > grep audio < find_you.dat > audio.dat
you@host > cat audio.dat
/dev/audio
/dev/audio0
/dev/audio1
/dev/audio2
/dev/audio3
/home/tot/cd2audio.txt
/home/tot/Documents/Claudio.dat
/var/audio
/var/audio/audio.txt

So haben Sie die Standardausgabe von grep, die Ihre Anfrage von der umgeleiteten Standardeingabe (hier der Datei find_you.dat) erhielt, weitergeleitet in die Datei audio.dat, was Ihnen die Ausgabe von cat anschließend auch bestätigt (siehe Abbildung 1.6).

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 1.6   Umleiten von Standardeingabe und Standardausgabe

In Tabelle 1.4 sehen Sie alle Umlenkungen auf einen Blick:


Tabelle 1.4   Verschiedene Umlenkungen einer Shell

Kanal Syntax Beschreibung
1 (Standardausgabe) cmd > file Standardausgabe in eine Datei umlenken
1 (Standardausgabe) cmd >> file Standardausgabe ans Ende einer Datei umlenken
2 (Standardfehlerausgabe) cmd 2> file Standardfehlerausgabe in eine Datei umlenken
2 (Standardfehlerausgabe) cmd 2>> file Standardfehlerausgabe ans Ende einer Datei umlenken
1 (Standardausgabe) 2 (Standardfehlerausgabe) cmd > file 2>&1 Standardfehlerausgabe und Standardausgabe in die gleiche Datei umlenken
1 (Standardausgabe) 2 (Standardfehlerausgabe) cmd > file 2> file2 Standardfehlerausgabe und Standardausgabe jeweils in eine extra Datei umlenken
0 (Standardeingabe) cmd < file Eine Datei in die Standardeingabe eines Kommandos umleiten


Rheinwerk Computing

1.10.4 Pipes  downtop

Bleiben wir doch beim Szenario vom Beispiel zuvor. Folgender Weg wurde gewählt, um alle Dateien des Users »you«, welche eine Zeichenfolge »audio« im Namen haben, zu finden.

you@host > find / -user you -print > find_you.dat 2>/dev/null
you@host > grep audio < find_you.dat
/dev/audio
/dev/audio0
/dev/audio1
/dev/audio2
/dev/audio3
/home/tot/cd2audio.txt
/home/you/cd2audio.txt
/home/you/Documents/Claudio.dat
/var/audio
/var/audio/audio.txt

Mit einer Pipe können Sie das Ganze noch abkürzen und benötigen nicht einmal eine Datei, die hierfür angelegt werden muss. Hier das Beispiel mit der Pipe, womit dieselbe Wirkung wie im Beispiel eben erreicht wird.

you@host >  find / -user you -print 2>/dev/null | grep audio
/dev/audio
/dev/audio0
/dev/audio1
/dev/audio2
/dev/audio3
/home/tot/cd2audio.txt
/home/you/cd2audio.txt
/home/you/Documents/Claudio.dat
/var/audio
/var/audio/audio.txt

Pipes werden realisiert, wenn mehrere Kommandos durch das Zeichen | miteinander verknüpft werden. Dabei wird immer die Standardausgabe des ersten Kommandos mit der Standardeingabe des zweiten Kommandos verbunden. Beachten Sie aber, dass die Standardfehlerausgabe hierbei nicht beachtet wird (siehe Abbildung 1.7).

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 1.7   Verknüpfen mehrerer Kommandos via Pipe

Die Anzahl der Pipes, die Sie hierbei aneinander reihen können, ist unbegrenzt. Wollen Sie bspw. nicht wissen, welche und wo, sondern wie viele Dateien sich mit der Zeichenfolge »audio« auf Ihrem System befinden, müssen Sie dem Befehl zuvor nur das Kommando wc mit der Option –l (für line) »pipen«.

you@host > find / -user you -print 2>/dev/null | \
   grep audio | wc -l
9

Rheinwerk Computing

1.10.5 Ein T-Stück mit tee  downtop

Wollen Sie die Standardausgabe eines Kommandos oder Shellscripts auf dem Bildschirm und in eine Datei oder gar mehrere Dateien gleichzeitig veranlassen, empfiehlt es sich, das Kommando tee zu verwenden.

you@host > du -bc | sort -n | tee februar05.log
8      ./bin
48      ./.dia/objects
48      ./.dia/shapes
48      ./.dia/sheets
48      ./.gconf
48      ./.gnome
...
1105091 ./OpenOffice.org1.1/user
1797366 ./OpenOffice.org1.1
1843697 ./.thumbnails/normal
1944148 ./.thumbnails
32270848        .
32270848        insgesamt

Im Beispiel wird die Plattenplatznutzung nach Bytes sortiert ausgegeben und, dank tee, in die Datei februar05.log geschrieben. Hier können Sie natürlich auch in mehr als einer Datei schreiben.

you@host > du -bc | sort -n | tee februar05.log year05.log
8      ./bin
48      ./.dia/objects
48      ./.dia/shapes
48      ./.dia/sheets
48      ./.gconf
48      ./.gnome
...
1105091 ./OpenOffice.org1.1/user
1797366 ./OpenOffice.org1.1
1843697 ./.thumbnails/normal
1944148 ./.thumbnails
32270848        .
32270848        insgesamt

Aber gerade, wenn Sie bei Log-Dateien einen regelmäßigen Jahresbericht erstellen wollen, sollten Sie tee mit der Option –a (append) verwenden. Damit wird die Ausgabe eines Kommandos bzw. des Shellscripts an die Datei(en) angefügt und nicht – wie bisher – überschrieben (siehe Abbildung 1.8).

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 1.8   Das Kommando tee im Einsatz


Rheinwerk Computing

1.10.6 Ersatzmuster (Wildcards)  downtop

Als Ersatzmuster (Wildcards) werden bestimmte Zeichen(-folgen) eines Wortes bezeichnet, die von der Shell durch eine andere Zeichenkette ersetzt werden. In der Shell werden hierzu die Zeichen * ? [ ] verwendet. Das heißt, findet die Shell bei der Analyse eines dieser Zeichen, geht der Interpreter davon aus, dass es sich hier um ein Ersatzmuster für andere Zeichen handelt. Die Shell sucht jetzt bspw. im Verzeichnis nach Dateien (Namen), welche auf dieses Muster (nach den von der Shell vorgegebenen Regeln) passen, und ersetzt die entsprechenden Wildcards in der Kommandozeile durch eine Liste mit gefundenen Dateien (Namen). Es wird dabei im Fachjargon von einer Dateinamen-Expansion oder auch von Globbing gesprochen.


Hinweis   Diese Namens-Expansion findet noch vor Ausführung des Kommandos in der Shell statt. Das Kommando selbst bekommt von diesem Vorgang nichts mehr mit. Die Argumente des Kommandos sind schon die expandierten Dateinamen.


Eine beliebige Zeichenfolge *

Das Zeichen * steht für eine beliebige Zeichenfolge im Dateinamen. Das Sternchen wurde selbst schon zu DOS-Zeiten verwendet und ist das am meisten angewandte Wildcard-Zeichen. Einfaches Beispiel:

you@host > grep Backup /home/tot/Mails/*.txt

Hier wird in allen Dateien mit der Endung ».txt« im Verzeichnis /home/tot/Mails nach dem Wort »Backup« gesucht. Die Position des Zeichens * können Sie im Suchwort fast beliebig wählen. Hier einige Beispiele:

you@host > ls *ript
myscript
you@host > ls *ript*
myscript  scripter
you@host > ls ript*
/bin/ls: ript*: Datei oder Verzeichnis nicht gefunden
you@host > ls text*.txt
text1.txt text2.txt text3.txt texta.txt textb.txt textc.txt textdatei_test.txt

Stimmt keine der Dateien mit dem gewünschten Muster überein, wird entweder eine dem Kommando entsprechende Fehlermeldung oder (bspw. mit echo) die Zeichenkette des Musters unverändert zurückgegeben.

Ein beliebiges Zeichen ?

Im Gegensatz zum Zeichen * wird das Metazeichen ? als Platzhalter für nur ein beliebiges Zeichen verwendet. Das heißt, wird das Zeichen ? verwendet, muss sich an dieser Stelle ein (und wirklich nur ein) beliebiges Zeichen befinden, damit das Muster übereinstimmt. Zur Demonstration einfach eine Gegenüberstellung, bei der zuerst das Metazeichen * und gleich darauf mit denselben Angaben das Zeichen ? verwendet wird:

you@host > ls datei*.dat
datei1.dat datei1b.dat datei1c.dat datei2.dat datei2b.dat datei_backup.dat datei1.dat~
you@host > ls datei?.dat
datei1.dat datei2.dat
you@host > ls datei1.dat?
datei1.dat~

Zeichenbereiche angeben

Meistens werden Sie wohl mit den Metazeichen * und ? zufrieden sein und größtenteils auch ans Ziel kommen. Dennoch kann die Bestimmung eines Dateinamens ausgeweitet werden. Sie können zusätzlich noch definieren, welche Zeichen für eine Ersetzung in Frage kommen sollen. Hierzu werden die eckigen Klammern ([ ]) verwendet. Alles, was sich darin befindet, wird als gültiges Zeichen des Musters für die Ersetzung akzeptiert.

you@host > ls datei*.txt
datei1a.txt  datei1b.txt  datei1.txt  datei2a.txt  datei2.txt  
datei3.txt
you@host > ls datei[12].txt
datei1.txt  datei2.txt
you@host >  ls datei[12]*.txt
datei1a.txt  datei1b.txt  datei1.txt  datei2a.txt  datei2.txt
you@host >  ls datei[123].txt
datei1.txt  datei2.txt  datei3.txt
you@host >  ls datei[1–3].txt
datei1.txt  datei2.txt  datei3.txt
you@host > ls datei[12][a].txt
datei1a.txt  datei2a.txt
you@host > ls datei[12][b].txt
datei1b.txt
you@host > ls datei[!12].txt
datei3.txt

Im Beispiel konnten Sie erkennen, dass Sie – statt alle möglichen Zeichen in eckigen Klammern aneinander zu reihen – auch mit einem Minuszeichen einen Bereich bestimmen können. Vorausgesetzt, das bzw. die Zeichen liegen in einem laufenden Bereich der ASCII-Tabelle. So passen z. B. mit datei[0–9].txt alle Dateinamen von 0 bis 9 in das Muster (datei1.txt, datei2.txt ... datei9.txt). Wird der Wert zweistellig, können Sie entweder datei[0–9][0–9].txt oder datei[0–9]*.txt verwenden. Wobei beide Versionen wieder unterschiedliche Ersetzungen durchführen, da die erste Version nur zwei dezimale Zeichen und die zweite Version beliebig viele weitere Zeichen enthalten darf.

Wollen Sie hingegen nur Dateinamen erhalten, die neben der dezimalen Zahl einen weiteren Buchstaben enthalten, können Sie auch datei[0–9][a–z].txt verwenden. Natürlich können Sie in den eckigen Klammern noch mehrere Bereiche (allerdings müssen diese immer fortlaufend gemäß der ASCII-Tabelle sein) verwenden. So liefert datei[a–cg–j1–3].txt Ihnen beispielsweise als Ergebnisse zurück, worin sich eines der Zeichen »a« bis »c«, »g« bis »j« und 1 bis 3 befindet.

Wollen Sie hingegen in den eckigen Klammern einzelne oder eine Folge von Zeichen ausschließen, dann können Sie die Expansion mittels ! auch negieren. Bspw. liefert Ihnen datei[!12].txt alles zurück, was als nächstes Zeichen nicht 1 oder 2 enthält (wie im Beispiel gesehen).

Des Weiteren können Sie die Expansionen mit den Metazeichen * und ? erweitern (allerdings nicht innerhalb der eckigen Klammer).

Wollen Sie die Datei-Expansionen in Aktion sehen, können Sie mit set die Debugging-Option –x setzen. Dann sehen Sie die Zeilen, nachdem eine Datei-Expansion ausgeführt wurde (Selbiges können Sie selbstverständlich auch mit den Metazeichen * und ? herbeiführen), zum Beispiel:

you@host > set -x
you@host > ls datei[12].txt
[DEBUG] /bin/ls  datei1.txt datei2.txt
datei1.txt  datei2.txt
you@host > ls datei[!12].txt
[DEBUG]  /bin/ls  datei3.txt
datei3.txt
you@host > ls datei[1–3]*.txt
[DEBUG]  /bin/ls  datei10.txt datei1a.txt datei1b.txt datei1.txt
                  datei2a.txt datei2.txt datei3.txt
datei10.txt  datei1b.txt  datei2a.txt  datei3.txt
datei1a.txt  datei1.txt   datei2.txt

Die Bash und die Korn-Shell bieten hierbei außerdem vordefinierte Parameter als Ersatzmuster an. Wollen Sie etwa nur Groß- und Kleinbuchstaben zulassen, können Sie hierfür statt [a–zA–Z] auch [:alpha:] verwenden. Sollen es nur dezimale Ziffern sein, dann kann [:digit:] statt [1–9] verwendet werden. In der Praxis sieht dies folgendermaßen aus:

you@host > ls datei[[:digit:]].txt
datei1.txt  datei2.txt  datei3.txt
you@host > ls datei[[:digit:]][[:alpha:]].txt
datei1a.txt  datei1b.txt  datei2a.txt

Selbstverständlich können Sie auch hier den Wert in den eckigen Klammern mit ! negieren. In Tabelle 1.5 finden Sie die Zeichenmengen, die Sie alternativ zur gängigen Schreibweise in den eckigen Klammern setzen können.


Tabelle 1.5   Alternativen zu den gängigsten Zeichenmengen

Zeichenmenge Bedeutung
[:alnum:] Buchstaben, Unterstrich und dezimale Ziffern
[:alpha:] Groß- und Kleinbuchstaben
[:digit:] Dezimale Ziffern
[:lower:] Kleinbuchstaben
[:upper:] Großbuchstaben
[:print:] Nur druckbare Zeichen
[:space:] Leerzeichen, Tabulator ...

Versteckte Dateien

Sollten Sie sich fragen, was mit den versteckten Dateien ist (das sind Dateien, die mit einem Punkt beginnen) bzw. wie Sie diese bei der Datei-Expansion mit einbeziehen können, so ist die Antwort nicht schwer. Sie müssen den Punkt explizit mit angeben, dann werden auch die versteckten Dateien beachtet.

you@host > ls *.conf
/bin/ls: *.conf: Datei oder Verzeichnis nicht gefunden
you@host > ls .*.conf
.xyz.conf .abc.conf

Tipp   In der Bash können Sie die versteckten Dateien auch ohne explizite Angabe des Punkts verwenden. Hierbei müssen Sie einfach mit shopt -s dotglob die Option glob_dot_filenames setzen. Deaktivieren können Sie das Ganze wieder mit shopt -u dotglob.



Rheinwerk Computing

1.10.7 Brace Extension (Bash und Korn-Shell only)  downtop

Mit der Brace Extension haben Sie eine weitere neue Form, um Muster formulieren zu können. Dieses Feature steht unter der Bourne-Shell nicht zur Verfügung. Das Prinzip ist recht einfach: Bei einer gültigen Brace Extension schreibt man Alternativ-Ausdrücke zwischen geschweifte Klammern getrennt von einem Komma zwischen den beiden Klammern. Die Syntax hierzu lautet:

präfix{ muster1, muster2 }suffix

Von der Shell wird dieses Muster folgendermaßen ausgewertet: Vor jeder Zeichenkette – innerhalb der geschweiften Klammern – wird das Präfix gesetzt und dahinter das Suffix angehängt. Es ist einfacher, als es sich anhört. So generiert aus der Syntaxbeschreibung die Shell zum Beispiel den Dateinamen präfixmuster1suffix und präfixmuster2suffix. Natürlich können noch weitere Alternativ-Ausdrücke in den geschweiften Klammern gesetzt werden.

Wollen Sie bspw. mehrere Dateien wie prozess.dat, process.dat und progress.dat gleichzeitig anlegen, dann könnten Sie hierfür die Brace Extension wie folgt einsetzen:

you@host >  touch pro{z,c,gr}ess.dat
you@host >  ls *.dat
process.dat  progress.dat  prozess.dat

Brace Extensions lassen sich aber auch verschachteln. Wollen Sie bspw. die Dateinamen dateiorginal.txt, dateiorginal.bak, dateikopie.txt und dateikopie.bak mit einer Brace Extension erzeugen, so wird dies folgendermaßen realisiert:

you@host > touch datei{orginal{.bak,.txt},kopie{.bak,.txt}}
you@host > ls datei*
dateikopie.bak  dateikopie.txt  dateiorginal.bak  dateiorginal.txt

Natürlich können Sie hier auch eine wilde Wildcard-Orgie veranstalten und alle bisher kennen gelernten Wildcards verwenden.

you@host > ls datei{*{.bak,.txt}}
dateikopie.bak  dateikopie.txt  dateiorginal.bak  dateiorginal.txt

Rheinwerk Computing

1.10.8 Muster-Alternativen (Bash und Korn-Shell only)  downtop

Und es gibt noch eine weitere Möglichkeit, Muster-Alternativen für Namen zu beschreiben, die zwar eher für Muster-Vergleiche von Zeichenketten und weniger im Bereich der Datei-Expansion eingesetzt werden, allerdings auch dafür verwendet werden können. Damit Ihnen diese Muster-Alternativen auch für die Bash zur Verfügung stehen, müssen Sie die Option extglob mit shopt (Abkürzung für shell option) ausschalten (shopt –s extglob).

you@host > ls *.dat
process.dat  progress.dat  prozess.dat
you@host > shopt -s extglob
you@host > ls @(prozess|promess|process|propan).dat
process.dat  prozess.dat
you@host > ls !(prozess|promess|process|propan).dat
progress.dat

In Tabelle 1.6 sind die einzelnen Möglichkeiten für solche Muster-Alternativen zusammengestellt:


Tabelle 1.6   Muster-Alternativen für die Bash und Korn-Shell

Muster-Alternativen Bedeutung
@(pattern1 | patter2 | ... | patternN) Eines der Muster
!(pattern1 | patter2 | ... | patternN) Keines der Muster
+(pattern1 | patter2 | ... | patternN) Mindestens eines der Muster
?(pattern1 | patter2 | ... | patternN) Keines oder eines der Muster
*(pattern1 | patter2 | ... | patternN) Keines, eines oder mehrere Muster


Rheinwerk Computing

1.10.9 Tilde-Expansion (Bash und Korn-Shell only)  toptop

Das Tilde-Zeichen ~ wird von der Bash und der Korn-Shell als Heimverzeichnis des aktuellen Benutzers ausgewertet. Hier einige typische Aktionen, die mit dem Tilde-Zeichen in der Bash und Korn-Shell durchgeführt werden:

you@host > pwd
/home/you
you@host > cd /usr
you@host > echo ~
/home/you
you@host > cd ~
you@host > pwd
/home/you
you@host > echo ~-
/usr
you@host > echo ~+
/home/you
you@host > cd ~-
you@host > echo ~-
/home/you
you@host > cd ~-
you@host > pwd
/home/you
you@host > echo ~tot
/home/you
you@host > mkdir ~/new_dir

Tabelle 1.7 zeigt, wie die einzelnen Tilde-Expansionen eingesetzt werden und ihre jeweilige Bedeutung.


Tabelle 1.7   Tilde-Expansionen

Angabe Bedeutung
~ Heimverzeichnis des eingeloggten Benutzers
~BENUTZERNAME Heimverzeichnis eines angegebenen Benutzers
~– Verzeichnis, das zuvor besucht wurde
~+ Aktuelles Arbeitsverzeichnis (wie pwd)



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
 << zurück
  
  Zum Katalog
Zum Katalog: Shell-Programmierung
Shell-Programmierung
bestellen
 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-Server






 Linux-Server


Zum Katalog: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Katalog: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Katalog: Linux Handbuch






 Linux Handbuch


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de