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