Der Befehl expr
In diesem Beitrag lernen Sie den Befehl expr kennen, welcher unter Linux- / UNIX-Betriebssystemen eingesetzt wird, um numerische- sowie String-Ausdrücke auszuwerten.
Neben der allgemeinen Syntax lernen Sie auch die Anwendung des Befehls expr anhand verschiedener Beispiele anschaulich kennen.
Allgemeine Syntax
Die allgemeine Syntax von expr lautet folgendermaßen:
expr [Ausdruck]
Der expr übergebene Ausdruck lässt sich nun aus verschiedenen Operanden / Operatoren zusammensetzen, welche in den folgenden Abschnitten näher erläutert werden.
String-Ausdrücke
Der Befehl expr unterstützt neben Pattern-Matching auch einige weitere String-Operatoren, welche bei der Erstellung von String-Ausdrücken auch kombiniert werden können. String-Operatoren haben die höchste Präzedenz aller bei expr verfügbaren Operatoren.
Im Folgenden werden die verfügbaren String-Operationen vorgestellt.
Pattern-Matching
Pattern-Matching wird mit der folgenden Syntax durchgeführt:
[String] : [Regex]
Die folgende alternative Syntax ist jedoch ebenfalls gültig:
match [String] [Regex]
Die übergebenen Argumente werden automatisch in Strings konvertiert. Das zweite Argument wird als einfacher regulärer Ausdruck interpretiert, wobei ein "^" als Präfix implizit angehängt wird, und mit dem ersten Argument verglichen.
Bei einem erfolgreichen Match wird standardmäßig die Anzahl übereinstimmender Zeichen ausgegeben - wurde im regulären Ausdruck geklammert ("(" und ")"), so wird stattdessen der mit diesem Subausdruck übereinstimmende Teil des übergebenen Strings ausgegeben. Für die Ausgabe des Pattern-Matching ist dabei lediglich das erste Vorkommen von Klammern relevant, alle weiteren Klammern dienen ausschließlich der Einhaltung von Präzedenzregeln. Schlägt der Match fehl, so wird ohne Verwendung von Klammerung eine "0", andernfalls der null-String ausgegeben.
Beispiel: Pattern-Matching 1
In diesem Beispiel soll am Anfang des Strings "Linux Prof. Hellberg EDV-Beratung - Profi-Tutorials" nach einer Übereinstimmung mit dem Wort "Linux" gesucht werden. Da das Zeichen "^", welches den Anfang einer Zeile markiert, stet impliziert wird, wird als regulärer Ausdruck lediglich das Wort "Linux" angegeben.
Eingabe:
expr 'Linux Prof. Hellberg EDV-Beratung - Profi-Tutorials' : 'Linux'
Ausgabe:
Es wird eine "5" ausgegeben, da die ersten 5 Zeichen des Strings mit dem regulären Ausdruck übereinstimmen. In diesem Fall entspricht dies genau der Länge des Wortes "Linux".
5
Beispiel: Pattern-Matching 2
Aus einem Titel wie "Der Befehl expr" soll in diesem Beispiel der Befehlsteil ("expr") extrahiert werden. Klammerung wird hierbei eingesetzt, um eine beliebige auf "Der Befehl" folgende Zeichenkette auszugeben.
Eingabe:
expr 'Der Befehl expr' : 'Der Befehl (.*)'
Ausgabe:
Erwartungsgemäß gibt expr an dieser Stelle das Wort "expr" aus. Mithilfe des verwendeten regulären Ausdrucks ist es damit möglich, den Befehlsteil eines beliebigen Titels "Der Befehl [Befehl]" zu erhalten.
expr
Substring
Ein Substring des übergebenen Strings [String], beginnend an der Position [Position] mit der Länge [Länge], wird mit der folgenden Syntax erhalten:
substr [string] [Position] [Länge]
Ist das Längen- und / oder Positions-Argument null, negativ oder nicht-numerisch, so wird stets der null-String ausgegeben.
Beispiel: Substring
Dem String "Prof. Hellberg EDV-Beratung" soll in diesem Beispiel der Name "Hellberg" entnommen werden. Dazu wird das Keyword "substr" mit der Position "7" (Position vom "H" im String) und der Länge "8" (Länge des Wortes "Hellberg") verwendet.
Eingabe:
expr substr 'Prof. Hellberg EDV-Beratung' 7 8
Ausgabe:
expr gibt nun die Zeichenkette, welche an der 7. Position beginnt und an der 14. Position (7+8-1) endet, aus.
Hellberg
Index
Die Position des ersten Vorkommnisses eines Zeichens aus einem spezifischen Zeichensatz im übergebenen String wird mit folgender Syntax ermittelt:
index [String] [Zeichensatz]
Wird kein Vorkommnis gefunden, so wird eine "0" ausgegeben.
Beispiel: Index
In diesem Beispiel soll die erste Position in einem String, an welcher eines der Zeichen "a", "b", "C" oder "d" auftaucht, ermittelt werden.
Eingabe:
expr index 'IT-Consulting' 'abCd'
Ausgabe:
In diesem Fall wird eine "4" ausgegeben, da das Zeichen "C" an 4. Position im String "IT-Consulting" auftaucht.
4
Länge
Die Länge eines übergebenen Strings wird folgendermaßen ermittelt:
length [String]
Beispiel: Länge
Die Länge des Strings "Profi-Tutorials" wird in diesem Beispiel ermittelt:
Eingabe:
expr length 'Profi-Tutorials'
Ausgabe:
expr gibt eine "15" aus - die Länge des Strings "Profi-Tutorials".
15
String-Interpretation
Mithilfe des Plus "+" Operators (GNU Extensions) wird das übergebene Argument [Token] als String interpretiert - unabhängig davon, ob es sich um ein spezielles Keyword, wie etwa "match" oder "index", handelt:
+ [Token]
Soll der Befehl expr ein Keyword als String interpretieren, so müssen stets Anführungszeichen "" verwendet werden.
Numerische Ausdrücke
Der Befehl expr erlaubt die Verwendung der mathematischen Standardoperationen - die üblichen Präzedenzregeln werden dabei eingehalten. Die Präzedenz der numerischen Operatoren ist höher als die der relationalen / logischen Operatoren.
Addition / Substraktion
Die Addition zweier Integer-Zahlen wird folgendermaßen durchgeführt:
[Integer 1] + [Integer 2]
Analog wird auch die Subtraktion durchgeführt:
[Integer 1] - [Integer 2]
Können die übergebenen Argumente nicht als Integer interpretiert werden, so gibt expr eine Error-Meldung aus.
Beispiel: Addition
Dieses Beispiel zeigt die Addition zweier Zahlen.
Eingabe:
expr 55 + 45
Ausgabe:
Das Ergebnis der Addition "55 + 45" wird ausgegeben.
100
Beispiel: Subtraktion
Hier wird die Subtraktion zweier Zahlen gezeigt.
Eingabe:
expr 10 - 2
Ausgabe:
expr gibt das Ergebnis der Subtraktion "10 - 2" aus.
8
Multiplikation / Division / Modulo
Die Multiplikation erfolgt nach folgender Syntax (Das Zeichen "*" muss maskiert werden, damit es nicht von der Shell interpretiert wird):
[Integer 1] * [Integer 2]
Die Division wird mit dem Operator "/" durchgeführt:
[Integer 1] / [Integer 2]
Schließlich wird auch der Modulo-Operator "%" unterstützt, welcher den Rest einer Integer-Division ausgibt:
[Integer 1] % [Integer 2]
Beispiel: Multiplikation
Zwei Zahlen werden in diesem Beispiel multipliziert.
Eingabe:
expr 6 * 6
Ausgabe:
Das Produkt der beiden Zahlen wird ausgegeben.
36
Beispiel: Division
Eine Zahl wird in diesem Beispiel durch eine andere geteilt. Zu beachten ist hierbei der Rest.
Eingabe:
expr 9 / 2
Ausgabe:
expr gibt eine "4" als Ergebnis der Division zurück. In diesem Fall besteht ein Rest, da es sich um eine Integer-Division handelt. Der Rest kann mit dem Modulo-Operator "%" bestimmt werden.
4
Beispiel: Modulo
In diesem Beispiel soll der Rest der zuvor durchgeführten Division "9 / 2" ermittelt werden.
Eingabe:
expr 9 % 2
Ausgabe:
Der durch die Modulo-Operation berechnete Rest beträgt "1". (2 * 4 + Rest 1 = 9)
1
Relationale / logische Ausdrücke
Auch einige relationale bzw. logische Operatoren werden von expr unterstützt. Die relationalen / logischen Operatoren haben die niedrigste Präzedenz - im Folgenden werden diese nach aufsteigender Rangfolge vorgestellt:
Oder
Ein Lazy-Oder wird mit der folgenden Syntax realisiert (das Pipe-Symbol "|" muss maskiert werden):
[Argument 1] | [Argument 2]
expr gibt hierbei das erste Argument zurück, wenn es sich weder um den null-String noch den Zahlenwert "0" handelt. Andernfalls wird das zweite Argument ausgegeben - vorausgesetzt die genannten Bedingungen gelten hierfür. Treffen die Bedingungen weeder bei dem ersten, noch dem zweiten Argument zu, so ist die Ausgabe "0".
Es handelt sich um ein Lazy-Oder, weswegen das zweite Argument nicht ausgewertet wird, wenn eine Ausgabe des ersten Arguments erfolgt.
Beispiel: Oder
Hier wird eine Order-Verknüpfung der beiden Argumente "5" und "0" durchgeführt.
Eingabe:
expr 5 | 0
Ausgabe:
Das Ergebnis der Oder-Verknüpfung ist die "5" - es handelt sich bei diesem ersten Argument weder um den null-String, noch um den Zahlenwert "0". Das zweite Argument "0" wird von expr daher nicht betrachtet.
5
Und
Mit der folgenden Syntax wird die Verknüpfung zweier Argumente mit einem Lazy-Und durchgeführt (das Et-Zeichen "&" muss maskiert werden):
[Argument 1] & [Argument 2]
expr gibt hier das erste Argument aus, sofern keines der beiden Argumente der null-String oder "0" ist. Andernfalls wird eine "0" ausgegeben.
Auch hier handelt es sich wieder um eine Lazy-Variante: Das zweite Argument wird nicht ausgewertet, wenn die Bedingungen für das erste Argument nicht zutreffen.
Beispiel: Und 1
Eine Und-Verknüpfung zweier Operatoren wird in diesem Beispiel vorgestellt.
Eingabe:
expr 0 & "hedv"
Ausgabe:
Es wird eine "0" ausgegeben, da es sich bei dem ersten Argument um den Zahlenwert "0" handelt.
0
Beispiel: Und 2
Dieses Beispiel zeigt eine weitere Und-Verknüpfung.
Eingabe:
expr "admina" & "hedv"
Ausgabe:
Das erste Argument "admina" wird ausgegeben, da es sich bei keinem der beiden Argumente um den null-String oder den Zahlenwert "0" handelt.
admina
Relationale Operatoren
Mithilfe der in der folgenden Tabelle aufgelisteten Operatoren lassen sich zwei Argumente miteinander vergleichen. Die Syntax ist die folgende (auch hier müssen Operatoren teilweise maskiert werden, da diese - beispielsweise die Umleitung mit "<" - sonst von der Shell interpretiert werden):
[Argument 1] [Operator] [Argument 2]
expr versucht zunächst, die übergebenen Argumente in Integer zu konvertieren und anschließend einen numerischen Vergleich durchzuführen - schlägt dies fehl, so wird ein lexikographischer Vergleich unter Verwendung der durch die Umgebungsvariable "LC_COLLATE" spezifizierten Sortierreihenfolge durchgeführt.
Operator | Beschreibung |
---|---|
< | [Argument 1] ist echt kleiner als [Argument 2] |
<= | [Argument 1] ist kleiner oder gleich [Argument 2] |
= bzw. == | [Argument 1] ist gleich [Argument 2] |
!= | [Argument 1] ist ungleich [Argument 2] |
>= | [Argument 1] ist größer oder gleich [Argument 2] |
> | [Argument 1] ist echt größer als [Argument 2] |
Beispiel: Gleichheit 1
In diesem Beispiel wird die Gleichheit zweier Argumente überprüft.
Eingabe:
expr "profi" == "profi"
Ausgabe:
Da beide Argumente gleich sind, gibt expr den Wert "1" aus.
1
Beispiel: Gleichheit 2
Auch hier soll die Überprüfung der Gleichheit zweier Argumente stattfinden.
Eingabe:
expr "profi" == "tutorials"
Ausgabe:
In diesem Fall wird eine "0" ausgegeben, da die Argumente "profi" und "tutorials" ungleich sind.
0
Beispiel: Größer als
Dieses Beispiel zeigt die Durchführung eines "größer als"-Vergleichs.
Eingabe:
expr 50 > 42
Ausgabe:
Es wird eine "1" ausgegeben - der Vergleich ist gültig.
1
Beispiel: Kleiner als
Hier wird ein "kleiner als"-Vergleich gezeigt.
Eingabe:
expr "xyz" < "abc"
Ausgabe:
Der Befehl expr gibt hier eine "0" aus, da das Argument "xyz" lexikographisch größer ist als das Argument "abc".
0
Exit-Status
Der Befehl expr kennt schließlich folgende Exit-Status:
Exit-Status | Beschreibung |
---|---|
0 | Der Ausdruck ist weder null, noch "0" |
1 | Der Ausdruck ist null oder "0" |
2 | Der Ausdruck ist ungültig |
3 | Ein interner Fehler ist aufgetreten (beispielsweise ein arithmetischer Überlauf) |
Abonniere JETZT unseren Newsletter!
Verpasse nie wieder neue Beiträge und exklusive Insider-Only-Inhalte!