is_integer ()
很长时间以来,我的POSIX函数都是这样的:
#!/bin/sh
is_integer ()
{
[ "$1" -eq "$1" ] 2> /dev/null
}
但是,今天,我发现它坏了。如果数字周围有空格,则它的值也会令人惊讶地达到true
,而我不知道该如何解决。
正确(预期)行为的示例:
is_integer 123
评估为true
。
错误(意外)行为的示例:
is_integer ' 123'
也计算为true
,但是显然包含一个前导空格,因此false
在这种情况下该函数预计将进行计算。
请仅提供符合POSIX的建议。谢谢你。
#!/bin/sh
is_integer ()
{
case "${1#[+-]}" in
(*[!0123456789]*) return 1 ;;
('') return 1 ;;
(*) return 0 ;;
esac
}
仅使用POSIX内置函数。从规范中不清楚是否+1
应该为整数,如果不是,+
则从case
行中删除。
它的工作原理如下。在${1#[+-]}
删除可选的前导符号。如果剩下的东西包含非数字,则它不是整数,同样,如果什么都没有。如果不是整数,则为整数。
编辑:将^更改为!否定字符类-谢谢@LinuxSecurityFreak
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句