Shell-Workshop (5)

Status
Für weitere Antworten geschlossen.

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
In diesem Workshop geht es um das Pattern Matching mit Dateinamen (globbing on filenames).

Eine Fähigkeit der Shell ist es, Dateinamen durch ein Muster zu generieren. Hierfür gibt es sogenannte Wildcard (Joker), die eine Stelle '?' oder eine Folge von Stellen '*' in einen Dateinamen beliebig halten und von der Shell durch konkrete Dateinamen ersetzt (substituiert) werden. Beispiel:
Rich (BBCode):
Syno> ls
a1      text1   text2   text3   text4   text99
Syno> ls text?
text1   text2   text3   text4
Syno> ls te*
text1   text2   text3   text4   text99
Syno> ls *1
a1      text1
Syno> ls ??
a1
Syno> ls ??????
text99

Es gibt noch eine Notation für eine Zeichenstelle, wo man eine Gruppe von Zeichen vorgibt; die Notation wird an den Beispielen deutlich:

Rich (BBCode):
Syno> ls text[134]
text1   text3   text4
Syno> ls text[1-4]
text1   text2   text3   text4
Syno> ls *[19]
a1      text1   text99

In der Gruppe kann man auch die Komplementärmenge/Negation durch das '!' ausdrücken:
Rich (BBCode):
Syno> ls text[!1]
text2   text3   text4

Anmerkung: Bei einigen Shells geht neben dem '!' auch das '^'.

Bislang scheint es, als würde das Kommando 'ls' etwas mit der Mustergenerierung der Dateinamen zu tun haben. Das ist ein Trugschluss, denn alle Ausgaben kann man auch durch das Kommando 'echo' erzeugen:

Rich (BBCode):
Syno> echo *
a1      text1   text2   text3   text4   text99

Man könnte sogar das Kommando selbst durch ein Muster erzeugen lassen:

Rich (BBCode):
Syno> *
-ash: a1: not found
Syno> a1 text1 text2 text3 text4 text99
-ash: a1: not found

Für die Fehlersuche ist es manchmal wichtig, sich anzuschauen, wie die Shell ein Muster erzeugt, deswegen gibt es eine Option, welche man mit 'set -x' einschalten kann, die vor der Ausführung die Dateinamen-Ersetzung anzeigt:

Rich (BBCode):
Syno> set -x
Syno> echo text[1-3]
+ echo text1 text2 text3
text1 text2 text3

Nun kann es sein, dass man statt einer Liste von Dateinamen einfach ein paar '*' mit dem echo ausgeben möchte. Da die Shell aber gnadenlos ist, muss man die '*' vor ihr schützen. Dazu gibt es Verfahren des Quotierens (Einschießen in Hochkomma) bzw. des Maskierens durch einen '\' (backslash).

Rich (BBCode):
Syno> echo '****'
+ echo ****
****
Syno> echo "****"
+ echo ****
****
Syno> echo \*\*\*\*
+ echo ****
****
Syno> echo "****" * '****'
+ echo **** a1 text1 text2 text3 text4 text99 ****
**** a1 text1 text2 text3 text4 text99 ****

Das gilt natürlich auch für '?' und '[...]' Konstruktionen, sobald sich Dateinamen bilden lassen. Deswegen sollte man immer Quotieren, damit man nicht aus Versehen ein Muster generiert. Jetzt wird vielleicht auch klar, warum ich Texte, die per echo ausgegeben werden, immer vorsorglich in einfache Hochkomma setze.

Rich (BBCode):
Syno> echo [*]
+ echo [*]

[*]
Syno> echo text[123]
+ echo text1 text2 text3
text1 text2 text3
Syno> echo text'[123]'
+ echo text[123]
text[123]

=======

Viel Spaß beim Experimentieren.

Itari

PS. set -x kann man mit set +x wieder ausschalten.


=========================================
Sinnvollerweise sind die Shell-Workshops aufeinander aufgebaut.

Shell-Workshop (4)
Shell-Workshop (6)
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat