Anzeige:
Ergebnis 1 bis 13 von 13

Thema: Strings mit Regex-Pattern vergleichen

  1. #1
    Registrierter Benutzer
    Registriert seit
    13.12.2004
    Beiträge
    15

    Strings mit Regex-Pattern vergleichen

    Hi,
    ich bin recht neu was Bash Scripting angeht.
    Ich versuche gerade über Regex Strings zu vergleichen. Leider misslingt das mit der Fehlermeldung:

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

    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    11.09.2003
    Beiträge
    100
    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:
    Code:
    var="hallo"
    pattern="hal.o"
    
    echo $var | grep $pattern
    
    if [ $? == 0 ]; then
        echo "passt"
    else
        echo "passt nicht"
    fi

  3. #3
    Registrierter Benutzer
    Registriert seit
    13.12.2004
    Beiträge
    15
    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

    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
    Geändert von Reality (23-02-2012 um 18:52 Uhr)

  4. #4
    Registrierter Benutzer
    Registriert seit
    13.12.2004
    Beiträge
    15
    Hallo,
    ich bin gerade hochgradig verwirrt, denn momentan funktioniert NICHTS mehr!

    Code:
    #!/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

  5. #5
    Registrierter Benutzer
    Registriert seit
    11.09.2003
    Beiträge
    100
    Meine bash beschwert sich über das Ausrufezeichen. Das ist ein Sonderzeichen. Also entweder raus nehmen, escapen oder in single quotes setzen:
    Code:
    echo 'gleich1!'

  6. #6
    Registrierter Benutzer
    Registriert seit
    13.12.2004
    Beiträge
    15
    Ä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?!

  7. #7
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Zeichenketten müssen auch al solches Gekenzeichnet sein!
    Andernfalls wird die Bash einen Binären vergleich zweier Variablen machen
    Siehe auch die Manpages "test"
    PHP-Code:
    #!/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 -'\033[1m'"the strings are NOT equal abort"'\033[0m';
      exit 
    1

    Geändert von undefined (26-02-2012 um 09:49 Uhr) Grund: Beispiele Dokumentiert
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  8. #8
    Registrierter Benutzer
    Registriert seit
    13.12.2004
    Beiträge
    15
    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!

    Code:
    #!/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!

  9. #9
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    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!
    Code:
    if [ "$?" = "0" ]; then
      echo "Gleich1"
    fi
    Richtig weil Integer:
    PHP-Code:
    if [ $? -eq 0 ]; then
      
    echo "Gleich1"
    fi 
    http://www-user.tu-chemnitz.de/~hot/...sten/bash.html
    Geändert von undefined (26-02-2012 um 12:31 Uhr)
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  10. #10
    Registrierter Benutzer
    Registriert seit
    13.12.2004
    Beiträge
    15
    OK, THX!!!

    L. G.
    Reality

  11. #11
    Registrierter Benutzer
    Registriert seit
    13.12.2004
    Beiträge
    15
    Sorry, nochmal zu den Vergleichen:

    Code:
    if [ "${VAR}"="${PATTERN}" ]; then
      echo "Gleich2"
    fi
    Funktioniert auch nicht. Ich muss ein Leerzeichen zwischen "=" machen, sonst wird in die If-Anweisung gesprungen...

  12. #12
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Zitat Zitat von Reality Beitrag anzeigen
    Sorry, nochmal zu den Vergleichen:

    Code:
    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/...html#testausdr
    Geändert von undefined (26-02-2012 um 15:37 Uhr)
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  13. #13
    Registrierter Benutzer
    Registriert seit
    13.12.2004
    Beiträge
    15
    Aber das Problem habe ich auch bei "==". Gilt das dann auch als Zuweisung?

    L. G.
    Reality

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •