2017-03-12 8 views
0

Ich habe eine Datei /tmp/gish.dat, die entweder eine Zahl (mehr als 0, und eine oder mehrere Ziffern) oder nichts enthält.Bash regulärer Ausdruck stimmt nicht überein, wenn

Wenn eine Nummer vorhanden ist, möchte ich, dass meine Funktion eine # zusammen mit der Nummer (z. B. #64) widergibt. Wenn keine Nummer vorhanden ist, möchte ich, dass meine Funktion nichts tut.

get_issue() { 
     if [ -f "/tmp/gish.dat" ] 
     then 
      iss=$(cat /tmp/gish.dat | grep -Eo '[0-9]+') 
      if [[ iss =~ '[0-9]+' ]] 
      then 
       echo "#$iss" 
      fi 
     fi 
    } 

Aus irgendeinem Grund stimmt die innere wenn nie überein. Sehr neu zu bash.

get_issue() { 
     if [ -f "/tmp/gish.dat" ] 
     then 
      iss=$(grep -Eo '[0-9]+' /tmp/gish.dat) 
      if [[ $iss ]] 
      then 
       echo "#$iss" 
      fi 
     fi 
    } 

Da grep -Eo Extrakte nur der passende numerische Teil, gibt es keine Notwendigkeit, den extrahierten String gegen die Regex in if wieder zum Spiel:

+3

Denken Sie einen Dollar sind vermisst Symbol auf Ihrer Variablen. Ändern Sie es in $ iss - in der if-Bedingung. – benjamin

+0

Angenommen, Ihre äußere Funktion funktioniert ordnungsgemäß, versuchen Sie, das Ergebnis des Shell-Aufrufs (iss) zu drucken, und überprüfen Sie, ob dies ordnungsgemäß funktioniert. EDIT: Ziemlich sicher, dass Sie das Dollar-Symbol vermissen, wie Benjamin bereits erwähnt. –

+0

Vielleicht schlage ich Ihnen auch vor, die Option -s zu prüfen, ob die Datei leer ist oder nicht :) – grail

Antwort

2

Sie können den Code auf diese Weise neu zu schreiben. [[ $iss ]] ist wahr, wenn $iss nicht leer ist.

+0

Danke, das ist großartig. – JMurphyWeb

4

Wenn Sie innerhalb von [[...]] einen Regex eingeben, handelt es sich nur um eine Zeichenfolge.

Ersetzen Sie '[0-9]+' durch [0-9]+.

0

wenn Sie brauchen so etwas wie 64 # drucken, # 45 usw. dann Ihren Code wie folgt ändern,

if [ -f "/tmp/gish.dat" ] 
    then 
     iss=$(cat /tmp/gish.dat | grep -Eo '[0-9]+' | tr '\n' ' ') 
     for isss in $iss  
     do 
       if [[ $isss =~ '[0-9]+' ]] 
       then 
        echo "#$isss" 
       fi 
     done; 

fi

Check-out dieses

Verwandte Themen