为了账号安全,请及时绑定邮箱和手机立即绑定

如何测试变量是否为Bash中的数字?

如何测试变量是否为Bash中的数字?

慕码人8056858 2019-07-11 13:25:01
如何测试变量是否为Bash中的数字?我只是不知道如何确保传递给我的脚本的参数是一个数字。我只想做这样的事:test *isnumber* $1 && VAR=$1 || echo "need a number"有什么帮助吗?
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

一种方法是使用正则表达式,如下所示:

re='^[0-9]+$'if ! [[ $yournumber =~ $re ]] ; then
   echo "error: Not a number" >&2; exit 1fi

如果值不一定是整数,请考虑适当地修改regex;例如:

^[0-9]+([.][0-9]+)?$

.或者用符号来处理数字

^[+-]?[0-9]+([.][0-9]+)?$


查看完整回答
反对 回复 2019-07-11
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

下面的解决方案也可以在基本的shell(如Bourne)中使用,而不需要正则表达式。基本上,任何使用非数字的数值计算操作都会导致错误,而在shell中该错误将被隐式地视为false:

"$var" -eq "$var"

如:

#!/bin/bashvar=aif [ -n "$var" ] && [ "$var" -eq "$var" ] 2>/dev/null; then
  echo numberelse
  echo not a numberfi

你也可以测试$?更显式的操作的返回代码:

[ -n "$var" ] && [ "$var" -eq "$var" ] 2>/dev/nullif [ $? -ne 0 ]; then
   echo $var is not numberfi

标准错误的重定向是为了隐藏bash输出的“整数表达式预期”消息,以防我们没有数字。

警告(感谢以下评论):

  • 带小数点的数字是

    标识为有效“数字”
  • 使用

    [[ ]]

    而不是

    [ ]

    将永远评估到

    true

  • 大多数非Bash shell总是将此表达式计算为

    true

  • Bash中的行为是无记录的,因此可能在没有警告的情况下发生变化。
  • 如果值在数字(例如“1a”)后包含空格,则会产生错误,如

    bash: [[: 1 a: syntax error in expression (error token is "a")

  • 如果值与var-name相同(例如i=“i”),则会产生错误,如

    bash: [[: i: expression recursion level exceeded (error token is "i")


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 694 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信