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

3

我知道如何检查一个参数是否为整数,使用以下代码:

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

然而,我需要检查参数是否不是整数。我该如何做?

4个回答

4

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

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

这个命令不起作用,一直出现“语法错误,附近有意外的标记”错误!实际上,唯一能正常工作的命令是我最初使用的那个。 - user2232423
1
@user2232423 附近未预期的令牌是什么 - Explosion Pills

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

注意,这种方法默认接受负整数,但您可以轻松修改它,使其仅接受正整数。
在我的脚本中,成功解析的整数将被打印为字符串,但是您也可以选择将其作为整数打印,使用%d

0

非常简单,你知道的。你可以这样做:

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

这是我主要用于数字检查的东西。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接