如何检查传递给shell脚本的参数是否不是整数?

时间:2013-04-01 14:29:53

标签: bash shell unix scripting arguments

我知道如何使用以下方法检查参数是否为整数:

if [[ $2 = *[[:digit:]]* ]]; then
    # $2 is a number
else
    # $2 is not a number
fi

但是,我需要检查参数是否不是整数。我怎么能这样做?

4 个答案:

答案 0 :(得分:4)

$2 = *[[:digit:]]*仅检查$2 是否包含数字。

# is an integer
[[ $2 =~ ^[[:digit:]]+$ ]]
# is not an integer
[[ ! $2 =~ ^[[:digit:]]+$ ]]

答案 1 :(得分:3)

符合POSIX标准的方法

健壮且可移植(符合POSIX;在dash中测试)方法是检查shell是否可以将变量解析为整数,如下面的脚本所示。

#!/bin/sh

# test-int.sh
# A script that tests whether its first argument is an integer

if [ "$1" -eq 0 -o "$1" -ne 0 ] >/dev/null 2>&1; then
    printf "integer: %s\n" "$1"
else
    printf "not an integer\n"
fi

测试

$ dash test-int.sh foo
not an integer
$ dash test-int.sh 098234
integer: 098234
$ dash test-int.sh 77239asdfasf
not an integer
$ dash test-int.sh -77239
integer: -77239

请注意,此方法也接受开箱即用的负整数,但您可以轻松地将其修改为仅接受正整数,例如。

在我的脚本中,成功解析的整数打印为字符串,但是,您可能希望将其打印为整数,{{1} }。

答案 2 :(得分:0)

你知道的很容易。你可以这样做:

   if echo $Myvar | egrep -q '^[0-9]+$'; then
      # $Myvar is a number
   else
      # $Myvar is not a number
   fi

这是我主要用于数字检查的一些事情。

答案 3 :(得分:0)

您只测试输入是否为数字;例如$ 2是“43”然后这将打印: 43不是数字 修复您的解决方案以检查实际数字可以使用正则表达式完成:

if [[ $2 =~ ^-?[[:digit:]]+$ ]]; then
    echo "$2 is a number"
fi

检查输入是否不是数字只是否定测试:

if [[ ! $2 =~ ^-?[[:digit:]]+$ ]]; then
    echo "$2 is not a number"
fi