web-dev-qa-db-ja.com

UNIXシェルで変数が数値であることを確認します

UNIXシェルで変数が数値であるか、数値を含むかどうかを確認するにはどうすればよいですか?

22
Gregor
if echo $var | egrep -q '^[0-9]+$'; then
    # $var is a number
else
    # $var is not a number
fi
22
Adam Rosenfield

シェル変数には型がないため、最も単純な方法は戻り型testコマンドを使用することです。

if [ $var -eq $var 2> /dev/null ]; then ...

(または正規表現で解析する)

17
Piotr Lesnicki

フォークもパイプもありません。純粋なPOSIXシェル:

case $var in
   (*[!0-9]*|'') echo not a number;;
   (*)           echo a number;;
esac

number:=数字列と仮定)。単一の先行-または+で署名された数値を許可する場合は、次のようにオプションの記号を削除します。

case ${var#[-+]} in
   (*[!0-9]*|'') echo not a number;;
   (*)           echo a number;;
esac
13
Jens

Extglobオプションを有効にしたksh93またはbashのいずれかで:

if [[ $var == +([0-9]) ]]; then ...
3
Darron

私はShellプログラミングの初心者ですので、最も簡単で読みやすいものを見つけようとしますvarが0以上であるかどうかを確認しますパラメータを選択する良い方法だと思います... :

if [ $var -ge 0 2>/dev/null ] ; then ...
2
Johnney Jung

ベアボーンシェルで利用可能な機能のみを使用するバージョン(つまり、shで動作します)、およびgrepを使用するよりも1つのプロセスが少ないバージョンです。

if expr "$var" : '[0-9][0-9]*$'>/dev/null; then
    echo yes
else
    echo no
fi

これにより、$varは、のみ整数を表します。正規表現を好みに合わせて調整し、expr regexp引数が暗黙的に先頭に固定されていることに注意してください。

1
Norman Gray

整数

if echo "$var" | egrep -q '^\-?[0-9]+$'; then 
    echo "$var is an integer"
else 
    echo "$var is not an integer"
fi

テスト(var = 2などを使用):

2 is an integer
-2 is an integer
2.5 is not an integer 
2b is not an integer

if echo "$var" | egrep -q '^\-?[0-9]*\.?[0-9]+$'; then 
    echo "$var is a number"
else 
    echo "$var is not a number"
fi

テスト(var = 2などを使用):

2 is a number
-2 is a number
-2.6 is a number
-2.c6 is not a number
2. is not a number
2.0 is a number
1
Oguz

これは、正規表現を使用して確認できます。

 ###    
    echo $var|egrep '^[0-9]+$'
    if [ $? -eq 0 ]; then
        echo "$var is a number"
    else
        echo "$var is not a number"
    fi
1
Wasim

簡単なテストコマンドでそれを行うことができます。

$ test ab -eq 1 >/dev/null 2>&1
$ echo $?
2

$ test 21 -eq 1 >/dev/null 2>&1
$ echo $?
1

$ test 1 -eq 1 >/dev/null 2>&1
$ echo $?
0

そのため、終了ステータスが0または1の場合、整数になりますが、exisステータスが2の場合、数値ではありません。

0

コマンドラインから値を取得し、入力を表示IS DECIMAL/NON-DECIMALおよびNUMBERかどうか:

NUMBER=$1

            IsDecimal=`echo "$NUMBER" | grep "\."`

if [ -n "$IsDecimal" ]
then
            echo "$NUMBER is Decimal"
            var1=`echo "$NUMBER" | cut -d"." -f1`
            var2=`echo "$NUMBER" | cut -d"." -f2`

            Digit1=`echo "$var1" | egrep '^-[0-9]+$'`
            Digit2=`echo "$var1" | egrep '^[0-9]+$'`
            Digit3=`echo "$var2" | egrep '^[0-9]+$'`


            if [ -n "$Digit1" ] && [ -n "$Digit3" ]
            then
                echo "$NUMBER is a number"
            Elif [ -n "$Digit2" ] && [ -n "$Digit3" ]
            then
                echo "$NUMBER is a number"

            else
                echo "$NUMBER is not a number"
            fi
else
            echo "$NUMBER is not Decimal"

            Digit1=`echo "$NUMBER" | egrep '^-[0-9]+$'`
            Digit2=`echo "$NUMBER" | egrep '^[0-9]+$'`

            if [ -n "$Digit1" ] || [ -n "$Digit2" ]; then
                echo "$NUMBER is a number"
            else
                echo "$NUMBER is not a number"
            fi
fi
0

正規表現(tcshコード)を使用しないテストを次に示します。

ファイルchecknumberを作成します。

if ( "$*" == "0" ) then
    exit 0 # number
else
    ((echo "$*" | bc) > /tmp/tmp.txt) >& /dev/null
    set tmp = `cat /tmp/tmp.txt`
    rm -f /tmp/tmp/txt
    if ( "$tmp" == "" || $tmp == 0 ) then
        exit 1 # not a number
    else
        exit 0 # number
    endif

endif

そして走る

chmod +x checknumber

使用する

checknumber -3.45

結果はエラーレベル($?)になります。

簡単に最適化できます。

0
khitron
if echo $var | egrep -q '^[0-9]+$'

実際、varが複数行の場合、これは機能しません。

すなわち

var="123
qwer"

特に、varがファイルに由来する場合:

var=`cat var.txt`

これは最も簡単です:

if [ "$var" -eq "$var" ] 2> /dev/null
then echo yes
else echo no
fi
0
Vouze
( test ! -z $num && test $num -eq $num 2> /dev/null ) && {
   # $num is a number
}
0
cab404