2012-12-09 6 views
6

Ich bin relativ neu zu Bash-Programmierung und ich erstelle derzeit einen einfachen Rechner.Bash RegEx, um Gleitkommazahlen von Benutzereingabe zu überprüfen

Es muss Gleitkommazahlen verwendet werden und prüfen, ob sie so sind.

Ich habe eine checkNumbers Funktion:

function checkNumber { 

    regExp=[0-9] 

    if [ $testNo =~ $regExp ] 
    then 
     echo "That is a number!" 
     let check=1 
    else 
     echo "Damn! Not A Number!" 
    fi 
} 

, wo ich den Benutzer zur Eingabe einer Nummer wie diese:

while [ $check -eq 0] 
do 
    echo "Please enter a number 
    read testNo 
    echo "" 
    checkNumber 
done 

dies nicht funktioniert, ich diesen Fehler:

./calculator.sh: line 39: [: =~: binary operator expected

Zeile 39 ist:

if [ $testNo =~ $regExp ] 

Ich habe viele Reguläre Ausdrücke versucht, wie:

^*[0-9]*$ 

und

^*[0-9]\.[0.9]*$ 

etc etc.

auch, habe ich gebunden andere Möglichkeiten der Durchführung der Überprüfung:

case $testNo 
in 
    ^*[0-9]*$) echo "That is a number!";; 
    *) echo "Error! Not a number!";; 
esac 

und

if [ $testNo = ^*[0-9]*$ ] 
then 
    echo "etc etc" 
else 
    echo "oops" 
fi 

Ich brauche auch dies mit Gleitkommazahlen zu arbeiten.

könnte jemand bitte lassen Sie mich wissen, wie ich darüber gehe?

+0

zitiere ich Sie '12345e42' brauchen Zahlen der Form nicht hoffen. –

Antwort

7

Diese Regex ^[-+]?[0-9]+\.?[0-9]*$ wird mit einem optionalen . nur Ziffern entsprechen:

$ echo 30 | grep -Eq '^[-+]?[0-9]+\.?[0-9]*$' && echo Match 
Match 

$ echo 30.10 | grep -Eq '^[-+]?[0-9]+\.?[0-9]*$' && echo Match 
Match 

$ echo 30. | grep -Eq '^[-+]?[0-9]+\.?[0-9]*$' && echo Match 
Match 

$ echo +30 | grep -Eq '^[-+]?[0-9]+\.?[0-9]*$' && echo Match 
Match 

$ echo -30 | grep -Eq '^[-+]?[0-9]+\.?[0-9]*$' && echo Match 
Match 

denke ich, wenn Sie ^*[0-9] Sie versucht ^[0-9]* wollte

Rexeplanation:

^  # Match start of string 
[-+]? # Match a leading + or - (optional) 
[0-9]+ # Match one or more digit 
\.?  # Match a literal . (optional, escaped) 
[0-9]* # Match zero or more digits 
$  # Match the end of the string 

Hinweis: Diese Zahlen übereinstimmt gefolgt von einem . wie 30., nein t sicher, wenn dies für Sie akzeptabel ist.

Edit: Do not regex

testNo=30.00 

if [[ $testNo =~ ^[+-]?[0-9]+\.?[0-9]*$ ]]; then 
    echo Match 
fi 

>>> Match 
+0

Dies wird nicht mit negativen Zahlen übereinstimmen. ':-(' –

+0

Vergaß diese Sachen: | –

+0

Gut. Jetzt hoffe ich, dass das OP nicht '1.2345e42' benötigt. –

2

Um diese Art von Funktion zu verwenden, benötigen Sie die [[ ... ]] Version der Bedingung. [ ist der "alte" test Befehl und behandelt keine regulären Ausdrücke überhaupt.

#! /bin/bash 
function checkNumber { 
    regExp='^[+-]?([0-9]+\.?|[0-9]*\.[0-9]+)$' 
    if [[ $testNo =~ $regExp ]] 
    then 
     echo "That is a number!" 
     let check=1 
    else 
     echo "Damn! Not A Number!" 
    fi 
} 
testNo=1 
checkNumber 
testNo=-1.2 
checkNumber 
testNo=+.2 
checkNumber 
testNo=+0. 
checkNumber 
testNo=a 
checkNumber 
testNo=hello2you 
checkNumber 

$ ./t.sh 
That is a number! 
That is a number! 
That is a number! 
That is a number! 
Damn! Not A Number! 
Damn! Not A Number! 

Siehe What is the difference between test, [ and [[ ?.

Eine Erklärung auf der Regex:

^ Anchor at start of string 
$ Anchor at end of string 

Diese beiden machen die Regex die gesamte Zeichenfolge übereinstimmen bestanden, teilweise Übereinstimmungen sind nicht erlaubt.

[+-] 

Matches entweder + oder -.

[+-]? 

macht, dass ein Teil optional, so dass die oben Streichhölzer genau +, - oder gar nichts.

Dann gibt es eine Alternierung (part1|part2) die übereinstimmt, wenn part1 oder übereinstimmt.

Teil eines ist:

[0-9]+\.? 

, die eine oder mehr (+) Ziffern übereinstimmt (aber nicht Null-Ziffern/leere Menge) und eine optionales .. Dies behandelt Zahlen des Formulars 123 und 534.. Aber nicht nur ..

Teil zwei ist:

[0-9]*\.[0-9]+ 

Dies entspricht null oder mehr (*) Ziffern, die von einem ., gefolgt von einer oder mehreren Ziffern. Dies entspricht allen anderen Gleitkommazahlen wie 1.3 oder .543 (ohne Exponentennotation), schließt aber nur . aus.

+0

'testNo = hallo2you' --->' Das ist eine Nummer! '' :-('. –

+0

Haha! Gute Sache, ich gucke' '' ' –

+0

Ja, danke fürs Wachen :) Sollte vernünftige Floats behandeln jetzt. – Mat

1
#!/bin/bash 
#script to validate 

while [ true ]; do 
clear 
echo "Introduce the numeric value: " 
read -r var 
if [[ $var =~ ^[+-]?([0-9]+)$ ]] 
    then 
     echo "You introduced an integer value (without decimals)" 
     read 
    else 
     if [[ $var =~ ^[+-]?([0-9]+\.)$ ]] 
     then 
      echo "Incomplete floating value (no values provided at the right of the point)" 
      read 
     else 
      if [[ $var =~ ^[+-]?(\.[0-9]+)$ ]] 
       then 
        echo "Incomplete floating value (no values provided at the left of the point)" 
        read 
       else 
        if [[ $var =~ ^[+-]?([0-9]+\.[0-9]+)$ ]] 
        then 
         echo "You introduced a correct floating value" 
         read 
        else 
         echo "You introduced something other than a valid numeric value" 
         read 
        fi 
      fi 
     fi 
fi 
done 
Verwandte Themen