如何在 POSIX shell 脚本中检查变量是否为整数(避免周围有空格的问题)?

Lin*_*eak 9 scripting shell-script posix

我的 POSIXis_integer ()函数看起来很长一段时间是这样的:

#!/bin/sh
is_integer ()
{
    [ "$1" -eq "$1" ] 2> /dev/null
}
Run Code Online (Sandbox Code Playgroud)

然而,今天,我发现它坏了。如果数字周围有一些空格,它也会令人惊讶地评估为true,我不知道如何解决这个问题。


正确(预期)行为示例:

is_integer 123评估为true.

不正确(意外)行为的示例:

is_integer ' 123'也计算为true,但是它显然包含一个前导空格,因此false在这种情况下该函数应计算为。


请仅提供符合 POSIX 的建议。谢谢你。

ica*_*rus 13

#!/bin/sh
is_integer ()
{
    case "${1#[+-]}" in
        (*[!0123456789]*) return 1 ;;
        ('')              return 1 ;;
        (*)               return 0 ;;
    esac
}
Run Code Online (Sandbox Code Playgroud)

仅使用 POSIX 内置函数。规范中不清楚是否+1应该是整数,如果不是,+则从case行中删除。

它的工作原理如下。在${1#[+-]}删除可选的前导符号。如果你留下了包含非数字的东西,那么它就不是一个整数,同样,如果你什么都没有。如果它不是整数,那么它就是一个整数。

编辑:将 ^ 更改为 ! 否定字符类 - 感谢@LinuxSecurityFreak