/bin/dash: 检查$1是否是数字

/bin/dash: 检查$1是否是数字

检查 $1 是否为 /bin/dash 中的整数的最佳方法是什么?

在 bash 中,我可以这样做:

[[ $1 =~ ^([0-9]+)$ ]]

但这似乎不符合 POSIX 标准,并且 dash 不支持这一点

答案1

以下检测整数(正数或负数),并在 和 下工作,dash均为 POSIX:

选项1

echo "$1" | grep -Eq '^[+-]?[0-9]+$' && echo "It's an integer"

选项2

case "${1#[+-]}" in
    ''|*[!0-9]*)
        echo "Not an integer" ;;
    *)
        echo "Integer" ;;
esac

或者,稍微使用一下:(nop) 命令:

! case ${1#[+-]} in *[!0-9]*) :;; ?*) ! :;; esac && echo Integer

答案2

无论是dashbashkshzsh、 POSIXshposh(“Bourne shell 的重新实现” sh);该case结构是最广泛可用和最可靠的:

case $1 in (*[!0-9]*|"") false ;; (*) true ;; esac

答案3

您可以-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

答案4

尝试使用它作为算术扩展,看看它是否有效。实际上,您需要比这更严格一些,因为算术扩展会忽略前导和尾随空格等。因此,进行算术扩展,并确保扩展结果与原始变量完全匹配。

check_if_number()
{
    if [ "$1" = "$((${1}))" ] 2>/dev/null; then
        echo "Number!"
    else
        echo "not a number"
    fi
}

这也接受负数 - 如果您确实想排除它们,请为 . 添加额外的检查$((${1} >= 0))

相关内容