3

こんにちは、私は割り当てに取り組んでいて、この部分で立ち往生しています。シェルで10進数/数値を検証するにはどうすればよいですか?

数値は受け入れられますが、10 進数は受け入れられません。どちらも受け入れられるようにしたいです。

これは私がこれまでに持っているものです

if echo $value | egrep '^[0-9]+$' >/dev/null 2>&1 ; then
echo "OK"
else
echo "There Is An Error"
echo "Please Try Again"
fi
4

7 に答える 7

5

grep を使用する代わりに、bash を使用して式をチェックできます。

#!/bin/bash

value=98.23
if [[ "$value" =~ ^[0-9]+(\.[0-9]+)?$ ]]
then
   echo good
else
   echo bad
fi
于 2013-01-23T08:40:15.593 に答える
2

代わりにこの正規表現を使用してください ^[0-9]*(\.[0-9]+)?$

于 2013-01-23T08:28:12.187 に答える
2

bash のパターン マッチングの使用:

shopt -s extglob
while read line; do
    if [[ $line == ?([-+])+([0-9])?(.*([0-9])) ]] ||
       [[ $line == ?(?([-+])*([0-9])).+([0-9]) ]]
    then
        echo "$line is a number"
    else 
        echo "$line NOT a number"
    fi
done << END
1
-1
a
1a
1.0
1.
.0
.
-.0
+
+0
+.0
END

出力

1 is a number
-1 is a number
a NOT a number
1a NOT a number
1.0 is a number
1. is a number
.0 is a number
. NOT a number
-.0 is a number
+ NOT a number
+0 is a number
+.0 is a number

パターン:

  • オプションの記号、その後に 1 つ以上の数字、オプションでドットと 0 個以上の数字が続く
  • オプションの符号、その後に 0 個以上の数字、その後に必須のドット、1 つ以上の数字が続きます。
于 2013-01-24T03:08:52.087 に答える
0

これはどう:

if [ ! -z $(echo "$value" | grep -o "^[1-9][0-9]*\.\?[0-9]*$") ]; then echo ok; fi

-z空の文字列をテストします。[ ! -z "" ]したがって、指定された文字列が一致するパターンで始まる場合、否定は満たされます。

于 2013-01-23T08:28:54.620 に答える
0

標準シェル ([[非標準)testでは、検証が行われます。

if test "$value" -eq 0 -o "$value" -ne 0 2> /dev/null; then
  : # $value is an integer
else
  : # $value is not an integer
fi
于 2013-01-23T12:41:27.297 に答える