检查参数是否为带数值表达式的整数

时间:2013-01-25 03:15:25

标签: regex bash

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

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

  • 对于1a11.3-1.2

  • 等字符串,使用警告
  • FAILS (显然)如果参数为0

怎么能修好? (使用算术表达式)

相关:Bash integer comparison

5 个答案:

答案 0 :(得分:2)

您可以按printf内置命令执行此任务:

if printf "%d" ${1:-foo} > /dev/null; then
    echo "number"
else
    echo "NOT a number"
fi
如果转换失败,

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

答案 1 :(得分:1)

我宁愿使用像

这样的东西
if [ $1 = "$(echo $1 | awk '{print strtonum($0)}')" ]; then
echo "number"
else
echo "not number"
fi

答案 2 :(得分: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

答案 3 :(得分:1)

使用扩展globs的解决方案

#/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

答案 4 :(得分:1)

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

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

请注意,上述内容实际上只测试正整数。添加+ - 。对于字符类,它将对正/负整数和小数部分起作用。我说的有点因为它会将123.456.789作为一个数字传递,但它无效。您需要添加额外的逻辑来清除错位或多个符号和小数点(以及“+”,“。”等字符串)。