以下程序检查第一个参数是数字还是非数字。到目前为止我能想出的最好的是:
#/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
怎么能修好? (使用算术表达式)
答案 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作为一个数字传递,但它无效。您需要添加额外的逻辑来清除错位或多个符号和小数点(以及“+”,“。”等字符串)。