Bash: Wie funktioniert ein Stringvergleich mit einem Muster in einem Skript?
Ich möchte gerne einen String mit einem Muster vergleichen. Und zwar will ich mit einer If-Anweisung alle Strings herausfiltern, die beispielsweise mit abc beginnen.
Ich habe so etwas versucht:
if [ $i="^abc.*$ ] then
blablabla
fi
In dem Skript meines Professors steht etwas, dass man bei einem Mustervergleich [[: anwenden müsste. Das Skript ist aber grottenschlecht - es ist kein Beispiel dabei und ich bekomme es einfach nicht hin. Es kann doch nicht so schwer sein, oder?
3 Antworten
Versuche es mal if [ -z "${i/abc*}" ] ; then
... ${i/abc} löscht im den String alles, was auf abc passt, wenn das am Anfang stand, ist dann der String leer.
Mit [[ kenne ich mich leider nicht aus.
Vielen Dank. Wenn ich das -z weglasse, macht es genau das, was ich brauche. :D
Hinweis(e):
Die eckigen Klammern [ ] stellen einen Test-Befehl zur Verfügung, der als Resultat eine 0 oder 1 liefert. Der Vergleich an sich muß auch durch Leerzeichen von dem Klammern getrennt werden.
Der Operator "=" hat eine doppelte Funktion: Zuweisung oder Vergleich:
X=Y # Zuweisung
X = Y # Vergleich
Außerdem ist der m.W. nur für Zeichenketten (bzw. Inhalte von Variablen) definiert; will man mit einer Zahlen-Konstanten vergleichen, wird der Operator "-eq" zum Einsatz. Analog für Größenvergleich "-lt", "-gt", ...
Aber auch hierbei ist das Leerzeichen signifikant!
Weil eigenständiger »Befehl« muß danach noch ein Semikolon folgen ... zumindest, wenn man den Ausdruck auf eine Zeile schreibt.
Wie so ein Vergleich korrekt auf eine Zeile geschrieben wird, erhält man einfach durch die folgende Eingabe im Terminal:
if
[ X = Y ]
then
echo gleich
else
echo ungleich
fi
Holt man sich dies Folge mit "Taste aufwärts" wieder hervor, sieht man
if [ X = Y ]; then echo gleich; else echo ungleich; fi
Man beachte die Semikolon! Und das Ergebnis! Siehe auxh:
if [ $X = $Y ]; then echo gleich; else echo ungleich; fi
Außerdem sieht man eventuelle Fehler sofort!
Immer wieder hilfreich:
man bash
oder, falls installiert:... und entsprechende Info vorhanden:
info bash
bei Perl würde es heissen: if ($i =~ /^abc/) :)
Danke. Mit Perl muss ich für diese Klausur auch arbeiten können. Dann stehe ich mit Sicherheit bei irgendeiner Übung auch mal vor diesem Problem.