Answers:
以下检测正整数或负整数,并在dash
和下工作,它们是POSIX:
echo "$1" | grep -Eq '^[+-]?[0-9]+$' && echo "It's an integer"
case "${1#[+-]}" in
''|*[!0-9]*)
echo "Not an integer" ;;
*)
echo "Integer" ;;
esac
或者,仅使用:
(nop)命令:
! case ${1#[+-]} in *[!0-9]*) :;; ?*) ! :;; esac && echo Integer
是否dash
,bash
,ksh
,zsh
,POSIX sh
,或posh
(“Bourne Shell的重新实现” sh
); 该case
构造是使用最广泛且最可靠的:
case $1 in (*[!0-9]*|"") false ;; (*) true ;; esac
dash
吗?它对我有效bash
但不起作用dash
。
dash
;询问我echo $?
在case命令之后添加的结果。
posh
(“ Bourne外壳的重新实现”)对该解决方案也没有问题。
case
:一个原因是您所描述的错误,另一个原因是在具有依赖于匹配括号(vim)的功能的编辑器中,它提供了更好的支持,并且我个人更容易识别它们的匹配,这尤其是显而易见。-WRT posh
为POSIX;好吧,我在手册页上引述的内容提出了其他建议,但我想,无论如何也不能依赖这样的非正式声明。既然我们处在POSIX时代,那么旧的bourne shell就不再那么重要了。
您可以-eq
对字符串本身使用测试:
$ dash -c 'a="a"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: a
not a number
$ dash -c 'a="0xa"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
dash: 1: [: Illegal number: 0xa
not a number
$ dash -c 'a="-1"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi'
number
如果错误消息有问题,请将错误输出重定向到/dev/null
:
$ dash -c 'a="0xa"; [ "$a" -eq "$a" ] 2>/dev/null|| echo no'
no
" 023 "
是一个数字。请注意,它适用于破折号,但不适用于所有其他POSIX shell,因为如果操作数为注释十进制整数,则行为未指定。例如,使用ksh时,会说SHLVL
或是1+1
一个数字。
尝试将其用作算术扩展,并查看其是否有效。实际上,您需要严格一点,因为例如算术扩展会忽略前导和尾随空格。因此,请进行算术扩展,并确保扩展后的结果与原始变量完全匹配。
check_if_number()
{
if [ "$1" = "$((${1}))" ] 2>/dev/null; then
echo "Number!"
else
echo "not a number"
fi
}
这也将接受负数-如果您确实要排除它们,请为添加一个额外的支票$((${1} >= 0))
。
[[
$(( ... ))
吗?如果是这样,我的答案应该仍然是正确的,我只需要添加一些额外的引号即可。
check_if_number 1.2
函数返回: dash: 3: arithmetic expression: expecting EOF: "1.2"
也许与expr
?
if expr match "$1" '^\([0-9]\+\)$' > /dev/null; then
echo "integer"
else
echo "non-integer"
fi
match
也不\+
是POSIX。它还会说0不是数字。你想expr "x$1" : 'x[0-9]\{1,\}$'
在POSIX系统中,可以使用expr:
$ a=a
$ expr "$a" - 0 >/dev/null 2>&1
$ [ "$?" -lt 2 ] && echo Integer || echo Not Integer
expr
实现将说9999999999999999999不是整数。POSIX不提供任何保证。实际上,至少在GNU系统上,它将说“长度”是一个整数。
expr 9999999999999999999 + 0
给了我3退出状态expr -12 + 0
,并expr length + 0
给我用GNU EXPR 0退出状态(+ string
力string
被视为与GNU字符串expr
。expr "$a" - 0
会更好地工作)。
-12
是一个有效的整数,并9999999999999999999
给溢出了。
这是一个简单的函数,使用与muru的答案相同的方法:
IsInteger() # usage: IsInteger string
{ # returns: flag
[ "$1" -eq "$1" ] 2> /dev/null
}
例:
p= n=2a3; IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"
p= n=23; IsInteger $n || p="n't" ; printf "'%s' is%s an integer\n" "$n" "$p"
输出:
'2a3' isn't an integer
'23' is an integer
foo\n123\nbar
不是整数,但可以通过此测试。