前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Bash中如何测试一个变量是否是数字

在Bash中如何测试一个变量是否是数字

作者头像
程序熵
发布2024-03-06 12:42:35
1440
发布2024-03-06 12:42:35
举报
文章被收录于专栏:技术汇技术汇

问:

我搞不清楚如何确保传递给我的脚本的参数是否是一个数字。

我想要做的其实就是类似这样的操作:

代码语言:javascript
复制
test *isnumber* $1 && VAR=$1 || echo "need a number"

能帮帮我吗?

答:

在 Bash 中,你可以使用几种方法来测试一个变量或参数(如 1、2 等)是否是数字。以下是一种通常的方法,使用条件中的正则表达式来进行测试:

代码语言:javascript
复制
#!/bin/bash

# 判断参数是否为数字的函数
is_number() {
    re='^[+-]?[0-9]+([.][0-9]+)?$'
    if [[ $1 =~ $re ]]; then
        return 0 # 在 Bash 中,0 表示成功
    else
        return 1 # 非零表示失败
    fi
}

# 使用方法
if is_number "$1"; then
    VAR="$1"
    echo "The variable is a number: $VAR"
else
    echo "Need a number"
fi

解释:

  • is_number 函数使用正则表达式来匹配数字。模式 ^[+-]?[0-9]+([.][0-9]+)?$ 将匹配任何整数或浮点数(包括带有正负号的)。
  • [[ 1 =~ re ]] 使用 Bash 的正则表达式匹配运算符来检查
  • return 0 表示输入与模式匹配,而 return 1 表示不匹配。
  • if is_number "

该示例会检查整数和浮点数。如果你只需要检查整数,可以简化正则表达式为 ^[+-]?[0-9]+$`。

记得给变量加引号("$1")以防止通配符扩展和单词分割。Bash 对空格和引号非常敏感;不给变量加引号可能会导致意外结果,特别是如果你的输入可能包含空格或特殊字符。

另一种常用的方法是使用 declare 内建命令与 -p(特定)选项和 -i 整数属性。这是使用该方法的示例脚本:

代码语言:javascript
复制
#!/bin/bash

VAR=$1

if declare -p VAR >/dev/null && [ "$VAR" -eq "$VAR" ] 2>/dev/null; then
  echo "The variable is a number: $VAR"
else
  echo "Need a number "
fi

然而,这种方法可能有一些不一致性,并且不如正则表达式方法那样健壮,因为 declare 可能在变量不是整数或者 VAR 已经被声明过时并不总是失败。 此外,-eq 测试运算符是为整数比较而设计的,对浮点数无效。

参考文档:

  • stackoverflow question 806906
  • help declare
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序熵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档