10

私はbashプログラミングに比較的慣れておらず、現在、簡単な計算機を作成しています。

浮動小数点数を使用して、そうであることを確認する必要があります。

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:39行目:[:=〜:二項演算子が必要です

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

浮動小数点数を処理するためにもこれが必要です。

誰かが私にこれについてどうやって行くのか教えてもらえますか?

4

4 に答える 4

11

この正規表現^[-+]?[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]*

再解釈:

^       # 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

注: これは数字の後に.likeが続くものと一致しますが30.、これが受け入れられるかどうかはわかりません。

編集:引用しないでくださいregex

testNo=30.00

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

>>> Match
于 2012-12-09T19:21:02.787 に答える
3

そのタイプの機能を使用するに [[ ... ]]は、条件のバージョンが必要です。[は「古い」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!

test、[ と [[ の違いは何ですか?」を参照してください。.

正規表現の説明:

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

これら 2 つは、正規表現が渡された文字列全体と一致するようにします。部分的な一致は許可されません。

[+-]

+または のいずれかに一致します-

[+-]?

その部分をオプションにするため、上記は正確+に一致するか、まったく一致-しません。

次に、または一致(part1|part2)する場合に一致する代替があります。part1part2

パート 1 は次のとおりです。

[0-9]+\.?

これは、1 つ以上の ( +) 桁 (ただし、0 桁/空のセットではない) とオプションの.. 123これは、およびの形式の数値を処理します534.。しかし、それだけではありません.

パート 2 は次のとおりです。

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

これは、0 個以上の ( *) 桁の後に が続き.、その後に 1 つ以上の数字が続くものと一致します。1.3これはorのような他のすべての浮動小数点数.543(指数表記なし) に一致しますが、..

于 2012-12-09T19:20:20.040 に答える
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
于 2013-12-03T20:39:37.660 に答える