PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Strings mit Regex-Pattern vergleichen



Reality
23-02-2012, 16:37
Hi,
ich bin recht neu was Bash Scripting angeht.
Ich versuche gerade über Regex Strings zu vergleichen. Leider misslingt das mit der Fehlermeldung:


/home/reality/bin/regex.sh: line 6: [=Hal?o]: command not found
Nicht gleich!

Hier der Code:


#!/bin/bash

VAR1="Hallo"
PATTERN1="Hal?o"

if ["$VAR1"="$PATTERN1"]; then
echo "equal"
else
echo "Not equal!"
fi


Woran kann das liegen?

Danke im Voraus!
Reality

ThorstenHirsch
23-02-2012, 17:49
Nun, zum einen kann die Shell nicht so ohne weiteres mit regular expressions umgehen. Dann ist das Fragezeichen nicht das Zeichen für irgendein Zeichen, sondern der Punkt. Und zum anderen, musst du in der if-Klammer den Vergleich mit == durchführen statt mit =, da = eine Zuweisung ist.

Regular expressions kannst du bspw. mit grep umsetzen:

var="hallo"
pattern="hal.o"

echo $var | grep $pattern

if [ $? == 0 ]; then
echo "passt"
else
echo "passt nicht"
fi

Reality
23-02-2012, 18:47
Hi Thorsten,
danke, für deine Antwort.
Das mit "=" ist schon richtig:

"=" may be used instead of "==" for strict POSIX compliance.
Aus Bash Beginers Guide (http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html)

Die Leerzeichen zwischen == solltest du auch rausnehmen, denn das gibt einen Parse-Error, falls mal eine Variable nicht gesetzt ist.

Mein Fehler war übrigens der, dass ich bei der if-Anweisung keine Leerzeichen nach "[" bzw. vor "]" gemacht habe. Die bash ist da wirklich wenig tolerant...

Dennoch danke!

L. G.
Reality

Reality
25-02-2012, 16:17
Hallo,
ich bin gerade hochgradig verwirrt, denn momentan funktioniert NICHTS mehr!


#!/bin/bash

VAR="blub"
PATTERN="Ha+ll+o+"

echo $VAR | grep $PATTERN

if [ $?==0 ]; then
echo "Gleich1!"
fi


if [ $VAR==$PATTERN ]; then
echo "Gleich2!"
fi


Gibt "Gleich1!" und "Gleich2!" aus.

Das kann doch nicht wahr sein!
Was ist falsch am Skript?!

Liebe Grüße
Reality

ThorstenHirsch
25-02-2012, 18:05
Meine bash beschwert sich über das Ausrufezeichen. Das ist ein Sonderzeichen. Also entweder raus nehmen, escapen oder in single quotes setzen:

echo 'gleich1!'

Reality
25-02-2012, 23:49
Ändert nichts...
Das Problem ist, dass in die If-Anweisung reingegangen wird, weil die beiden Strings angeblich gleich sind, was sie ja nicht sind. "blub" und "Ha+ll+o+" sind von Grund auf verschieden und sollten natürlich nicht gleich sein.
Wo ist also das Problem?!

undefined
26-02-2012, 09:25
Zeichenketten müssen auch al solches Gekenzeichnet sein!
Andernfalls wird die Bash einen Binären vergleich zweier Variablen machen
Siehe auch die Manpages "test"


#!/bin/bash

a="Hallo"
b="Haylo"

## 1) Variante mit Ausgabe Behandlung (POSIX Version)
if [ "${a}" = "${b}" ] ; then
echo "the strings are equal"
else
echo "the strings are NOT equal"
fi

## 2) Ausführliche Variante für Anfänger zum besseren Verständnis ;)
if test "${a}" == "${b}" ; then
echo "the strings are equal"
else
echo "the strings are NOT equal"
fi

## 3) Wenn die Zeichenkette mit dem Regulären Ausdruck Übereinstimmt
## Die Klammern sind bei dieser POSIX Variante wichtig!
## Eben so das setzen der Variablen weil es sich um einen Binären vergleich handelt!
regex="([hH]allo)"
if [[ ${a} =~ $regex ]] ; then
echo "the strings are in case insensitive equal"
else
echo "the strings are NOT equal"
fi

## 4) Variante bei falsch aussteigen
test "${a}" = "${b}" || {
tput bel
echo -e '\033[1m'"the strings are NOT equal abort"'\033[0m';
exit 1
}

Reality
26-02-2012, 12:00
Hallo undefined,
danke, für deine Antwort.
Zuerst meine erste Frage: Kennst du ein gutes Tutorial für bash?

Meine zweite Frage:
In einem Forum hatte ich gelesen, dass man zwischen "==" oder "=" keine Leerzeichen machen sollte, da, falls eine Variable nicht gesetzt ist, es zu einem Parse-Error kommt.

Nun habe ich bemerkt, dass dieser Code ohne Leerzeichen gar nicht richtig funktioniert!


#!/bin/bash

VAR="blub"
PATTERN="Ha+ll+o+"

echo $VAR | grep $PATTERN

if [ "$?" = "0" ]; then
echo "Gleich1"
fi

if [ ${VAR} = ${PATTERN} ]; then
echo "Gleich2"
fi


Mache ich die Leerzeichen hier raus, dann wird in die if-Anweisung reingesprungen!
Wie kann denn so etwas zustande kommen?!

Meine dritte Frage: Aus welchem Grund hast du bei deinem 3. Beispiel zwei Strings binär verglichen? Gibt es da einen eklatanten Vorteil?

Danke, im Voraus!

undefined
26-02-2012, 12:29
Du hast nicht verstanden was ich mit Zeichenketten meinte!!
Ein String wird bei der Bash immer mit einem " oder ' (für Konstanten) eingeleitet und beendet!

Alles andere sind Binäre oder je nach abfrage siehe die Manpages Test (in der Konsole "man test") Integer werte!

Der Code ist absolut falsch und für Anfänger ist die Abfrage von $? (stdin|stdout|stderr) Innerhalb von Scripten nicht zu empfehlen! Das wirst du Spätestens dann merken wenn du innerhalb deiner Scripte andere Prozesse anstossen willst!


if [ "$?" = "0" ]; then
echo "Gleich1"
fi

Richtig weil Integer:


if [ $? -eq 0 ]; then
echo "Gleich1"
fi

http://www-user.tu-chemnitz.de/~hot/unix_linux_werkzeugkasten/bash.html

Reality
26-02-2012, 12:37
OK, THX!!! :)

L. G.
Reality

Reality
26-02-2012, 13:47
Sorry, nochmal zu den Vergleichen:


if [ "${VAR}"="${PATTERN}" ]; then
echo "Gleich2"
fi


Funktioniert auch nicht. Ich muss ein Leerzeichen zwischen "=" machen, sonst wird in die If-Anweisung gesprungen...

undefined
26-02-2012, 15:34
Sorry, nochmal zu den Vergleichen:


if [ "${VAR}"="${PATTERN}" ]; then
echo "Gleich2"
fi


Funktioniert auch nicht. Ich muss ein Leerzeichen zwischen "=" machen, sonst wird in die If-Anweisung gesprungen...

Ohne Leerzeichen erfolgt eine Variablen Zuweisung, mit Leerzeichen ist es wie erwünscht ein Operator Vergleich.

Bitte Lese http://www-user.tu-chemnitz.de/~hot/unix_linux_werkzeugkasten/bash.html#testausdr

Reality
27-02-2012, 11:01
Aber das Problem habe ich auch bei "==". Gilt das dann auch als Zuweisung?

L. G.
Reality