我只是不知道如何确保传递给脚本的参数是否为数字。

我只想这样做:

test *isnumber* $1 && VAR=$1 || echo "need a number"

有什么帮助吗?


当前回答

没有人建议bash的扩展模式匹配:

[[ $1 == ?(-)+([0-9]) ]] && echo "$1 is an integer"

或使用POSIX字符类:

[[ $1 == ?(-)+([[:digit:]]) ]] && echo "$1 is an integer"

其他回答

我会这样做:

printf "%g" "$var" &> /dev/null
if [[ $? == 0 ]] ; then
    echo "$var is a number."
else
    echo "$var is not a number."
fi

注意:这将nan和inf识别为数字。

没有人建议bash的扩展模式匹配:

[[ $1 == ?(-)+([0-9]) ]] && echo "$1 is an integer"

或使用POSIX字符类:

[[ $1 == ?(-)+([[:digit:]]) ]] && echo "$1 is an integer"

接受的答案在所有情况下都不适用于我,BASH 4+因此:

# -- is var an integer? --
# trim leading/trailing whitespace, then check for digits return 0 or 1
# Globals: None
# Arguments: string
# Returns: boolean
# --
is_int() {
    str="$(echo -e "${1}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
    case ${str} in ''|*[!0-9]*) return 1 ;; esac
    return 0
}

如何使用它?

有效(将返回0=true):

is_int "100" && echo "return 0" || echo "return 1"

无效(将返回1=false):

is_int "100abc" && echo "returned 0" || echo "returned 1"
is_int ""  && echo "returned 0" || echo "returned 1"
is_int "100 100"  && echo "returned 0" || echo "returned 1"
is_int "      "  && echo "returned 0" || echo "returned 1"
is_int $NOT_SET_VAR  && echo "returned 0" || echo "returned 1"
is_int "3.14"   && echo "returned 0" || echo "returned 1"

输出:

returned 0
returned 1
returned 1
returned 1
returned 1
returned 1
returned 1

注意,在Bash中,1=假,0=真。我只是把它打印出来,而更可能是这样的:

if is_int ${total} ; then
    # perform some action 
fi

我使用expr。如果尝试将零添加到非数值,则返回非零:

if expr -- "$number" + 0 > /dev/null 2>&1
then
    echo "$number is a number"
else
    echo "$number isn't a number"
fi

如果需要非整数,可以使用bc,但我不认为bc有完全相同的行为。将零添加到非数字会得到零,它也会返回值零。也许你可以把bc和expr结合起来。使用bc将零添加到$number。如果答案为0,则尝试expr验证$number不为零。

几乎是你想要的语法。只需要一个函数编号:

#!/usr/bin/bash

isnumber(){
  num=$1
  if [ -z "${num##*[!0-9]*}" ]; 
    then return 1
  else
    return 0
  fi
}

$(isnumber $1) && VAR=$1 || echo "need a number";
echo "VAR is $VAR"

测试:

$ ./isnumtest 10
VAR is 10
$ ./isnumtest abc10
need a number
VAR is