2012-12-09 10 views
6

मैं प्रोग्रामिंग को बैश करने के लिए अपेक्षाकृत नया हूं और मैं वर्तमान में एक साधारण कैलकुलेटर बना रहा हूं।बैश रेगेक्स उपयोगकर्ता इनपुट से फ़्लोटिंग पॉइंट नंबरों की जांच करने के लिए

इसे फ़्लोटिंग पॉइंट नंबरों का उपयोग करने की आवश्यकता है और जांचें कि वे ऐसा हैं।

मैं एक checkNumbers समारोह है:

function checkNumber { 

    regExp=[0-9] 

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

जहां मैं इस तरह एक नंबर इनपुट करने के लिए उपयोगकर्ता मिलता है:

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

:

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

यह काम नहीं करता, मैं इस त्रुटि मिलती है

लाइन 39 है:

if [ $testNo =~ $regExp ] 

मैं रेगुलर एक्सप्रेशन के बहुत प्रयास किया है:

^*[0-9]*$ 

और

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

आदि आदि

भी, मैं बंधा है अन्य चेक के प्रदर्शन के तरीके:

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

और

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

मुझे फ़्लोटिंग पॉइंट नंबरों के साथ काम करने की भी आवश्यकता है।

क्या कोई मुझे बता सकता है कि मैं इस बारे में कैसे जाता हूं?

+0

मुझे आशा है कि आप फार्म '12345e42' की संख्या की जरूरत नहीं है बोली न करें। –

उत्तर

7

इस regex ^[-+]?[0-9]+\.?[0-9]*$ एक वैकल्पिक . के साथ ही अंक मिलान हो जाएगा:

$ 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 

मुझे लगता है कि जब आप ^*[0-9] की कोशिश की आप ^[0-9]*

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 

नोट: इस संख्या से मेल खाता है . के बाद 30., नहीं यह सुनिश्चित नहीं है कि यह आपके लिए स्वीकार्य है या नहीं।

संपादित करें: regex

testNo=30.00 

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

>>> Match 
+0

यह नकारात्मक संख्या से मेल नहीं खाएगा। ':-(' –

+0

उन चीजों के बारे में भूल गए: –

+0

अच्छा। अब मुझे उम्मीद है कि ओपी को '1.2345e42' की आवश्यकता नहीं है। –

2

उस प्रकार की सुविधा का उपयोग करने के लिए, आपको सशर्त के [[ ... ]] संस्करण की आवश्यकता है। [ "पुराना" test कमांड है और नियमित अभिव्यक्तियों को बिल्कुल संभाल नहीं करता है।

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

What is the difference between test, [ and [[ ? देखें।

regex पर बारे में स्पष्टीकरण:

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

इन दो regex पूरी स्ट्रिंग पारित कर दिया मिलान करने, आंशिक मिलान अनुमति नहीं है।

[+-] 

मैचों या तो + या -

[+-]? 

, वह हिस्सा वैकल्पिक बना देता है तो इसके बाद के संस्करण मैचों बिल्कुल +, - या कुछ भी नहीं बिल्कुल नहीं।

फिर एक विकल्प (part1|part2) है जो part1 या part2 मैचों से मेल खाता है।

भाग एक है:

[0-9]+\.? 

जो एक या अधिक (+) से मेल खाता अंक (लेकिन शून्य अंक/खाली सेट) और एक वैकल्पिक .। यह 123 और 534. रूपों की संख्या को संभालता है। लेकिन सिर्फ . नहीं।

भाग दो है:

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

यह शून्य या अधिक (*) अंक, एक . द्वारा पीछा किया, एक या एक से अधिक संख्याएं मेल खाता है। यह अन्य सभी फ्लोट्स जैसे 1.3 या .543 (एक्सपोनेंट नोटेशन के बिना) से मेल खाता है, लेकिन अभी भी . को छोड़ देता है।

+0

'testNo = hello2you' ---> 'यह एक संख्या है!' ':-(' –

+0

हाहा! अच्छी बात मैं देख रहा हूं' ;-) ' –

+0

हां, घड़ी रखने के लिए धन्यवाद :) उचित फ़्लोट को संभालना चाहिए अभी व। – 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 
संबंधित मुद्दे