web-dev-qa-db-ja.com

/ bin / dash:$ 1が数値かどうかを確認します

$ 1が/ bin/dash内の整数であるかどうかを確認する最良の方法は何ですか?

Bashでは、次のことができます。

[[ $1 =~ ^([0-9]+)$ ]]

しかし、それはPOSIXに準拠していないようで、ダッシュはそれをサポートしていません

12
Martin Vegter

以下は、正または負の整数を検出し、dashおよびPOSIXで機能します。

オプション1

echo "$1" | grep -Eq '^[+-]?[0-9]+$' && echo "It's an integer"

オプション2

case "${1#[+-]}" in
    ''|*[!0-9]*)
        echo "Not an integer" ;;
    *)
        echo "Integer" ;;
esac

または、:(nop)コマンド:

! case ${1#[+-]} in *[!0-9]*) :;; ?*) ! :;; esac && echo Integer
12
John1024

dashbashkshzsh、POSIX sh、またはposh"ボーンシェルの再実装 "sh); case構文は、最も広く利用可能で信頼性の高いものです。

case $1 in (*[!0-9]*|"") false ;; (*) true ;; esac
5
Janis

文字列に対して-eqテストをそれ自体で使用できます。

$ dash -c 'a="a"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi' 
dash: 1: [: Illegal number: a
not a number
$ dash -c 'a="0xa"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: 0xa
not a number
$ dash -c 'a="-1"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
number

エラーメッセージが問題である場合は、エラー出力を/dev/nullにリダイレクトします。

$ dash -c 'a="0xa"; [ "$a" -eq "$a" ] 2>/dev/null|| echo no'
no
1
muru

muruの答え と同じ方法を使用した単純な関数を次に示します。

IsInteger()      # usage: IsInteger string
{               #  returns: flag
        [ "$1" -eq "$1" ] 2> /dev/null
}

例:

p= n=2a3; IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"
p= n=23;  IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"

出力:

'2a3' isn't an integer
'23' is an integer
0
agc

算術展開として使用してみて、機能するかどうかを確認してください。たとえば、算術展開では先頭と末尾のスペースが無視されるため、実際にはそれよりも少し厳密にする必要があります。算術展開を行い、展開結果が元の変数と正確に一致することを確認してください。

_check_if_number()
{
    if [ "$1" = "$((${1}))" ] 2>/dev/null; then
        echo "Number!"
    else
        echo "not a number"
    fi
}
_

これは負の数も受け入れます-本当にそれらを除外するつもりなら、$((${1} >= 0))に追加のチェックを追加します。

0
godlygeek

おそらくexpr

if expr match "$1" '^\([0-9]\+\)$' > /dev/null; then
  echo "integer"
else 
  echo "non-integer"
fi
0
steeldriver

POSIXシステムでは、 expr を使用できます。

$ a=a
$ expr "$a" - 0 >/dev/null 2>&1
$ [ "$?" -lt 2 ] && echo Integer || echo Not Integer
0
cuonglm