1

以下程序检查第一个参数是数字还是非数字。到目前为止,我能想到的最好的是:

#/bin/bash
if (( $# )) && (( $1 != 0 )) ; then
    echo "number"
else
    echo "not number"
fi
  • 这适用于 , , 等数字1-1适用100于字符串a, abc, a431,或者如果没有给出参数。

  • 它适用于字符串警告1a1,如, 1.3,-1.2

  • 但是如果参数是FAILS(显然)0

这怎么可能解决?(使用算术表达式)

相关:Bash 整数比较

4

5 回答 5

2

您可以按printf内置命令来完成这项工作:

if printf "%d" ${1:-foo} > /dev/null; then
    echo "number"
else
    echo "NOT a number"
fi

printf如果转换失败,则以非零状态退出。如果未设置,${1-...}则表示法提供已知的非数字。$1

于 2013-01-25T14:19:38.437 回答
1

我宁愿使用类似的东西

if [ $1 = "$(echo $1 | awk '{print strtonum($0)}')" ]; then
echo "number"
else
echo "not number"
fi
于 2013-01-25T03:22:47.457 回答
1

您可以使用正则表达式:

#/bin/bash

if [[ "$1" =~ ^-?[0-9]+$ ]] ; then
    echo "number"
else
    echo "not number"
fi

如果你想让它处理浮点,你可以很容易地调整它:

#/bin/bash

if [[ "$1" =~ ^-?[0-9]+$ || "$1" =~ ^-?[0-9]*\.[0-9]+ ]] ; then
    echo "number"
else
    echo "not number"
fi
于 2013-01-25T03:49:48.107 回答
1

使用扩展 glob 的解决方案

#/bin/bash
shopt -s extglob
if [[ $1 = *[0-9]* && $1 = ?([+-])*([0-9])?(.*([0-9])) ]]; then
    echo "Is a number"
else
    echo "Not a number"
fi

输出

$ ./test -1
Is a number
$ ./test 0
Is a number
$ ./test 1
Is a number
$ ./test a
Not a number
$ ./test -1.2
Is a number
$ ./test 0.0
Is a number
$ ./test 1.2
Is a number
$ ./test a.b
Not a number
于 2013-01-25T05:52:06.900 回答
1

可能更容易测试什么不是数字:

if (( $# )) ; then
  if [[ $1 == *[^0-9]* ]] ; then
    echo "Not a number"
  else
    echo "Is a number"
  fi
fi

请注意,上面实际上仅测试正整数。添加 +-。到字符类,它将在某种程度上适用于正/负整数和小数。我之所以这么说是因为它会将 123.456.789 作为数字传递,但它是无效的。您需要添加额外的逻辑来清除错位或多个符号和小数点(以及“+”、“.”等字符串)。

于 2013-01-25T14:54:05.863 回答