2012-12-09 71 views
6

我對bash編程比較陌生,目前我正在創建一個簡單的計算器。Bash RegEx檢查用戶輸入的浮點數

它需要使用浮點數,並檢查他們是如此。

我有一個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 
} 

從哪裏獲得用戶輸入一些這樣的:

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

這是不行的,我得到這個錯誤:

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

線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

此正則表達式^[-+]?[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

好,現在我希望OP不需要'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 [[ ?

對正則表達式的解釋:

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

這兩使正則表達式傳遞的整個字符串匹配,部分匹配是不允許的。

[+-] 

比賽無論是+-

[+-]? 

使得該部分可選,因此上述比賽正好+-還是什麼都沒有。

然後有一個更改(part1|part2)如果part1part2匹配,則匹配。

第一部分是:

[0-9]+\.? 

相匹配的一個或多個(+)數字(但不爲零的數字/空集)和一個可選.。這處理的形式爲123534.。但不僅僅是.

第二部分是:

[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