Contents

检查变量是否是Bash中的数字

1. 概述

Python、Perl、Tcl 和所有 UNIX shell 脚本语言(如 Bash)都是解释性语言的示例。这就是为什么 Bash 一次读取和解释一个命令并且不按类型隔离其变量的原因。事实上,Bash 是无类型的。

在本教程中,让我们更深入地了解如何检查变量是否有效地是数字。首先,我们将详细展示许多可能的解决方案。其次,我们将解释每个解决方案背后的想法。

2. 比较变量

Bash 将其变量视为字符串,但它允许对变量进行所有算术运算和比较。基本思想是,要评估变量是否为数字,我们 需要验证其值是否仅包含数字

2.1.使用正则表达式

作为第一个示例,让我们编写一个名为integers.sh的脚本,它使用正则表达式来确保给定的输入是一个整数值:

#!/bin/bash
echo $1 | grep "^-\?[0-9]+$"

主要成分是:

  • $1 包含传递给脚本调用的参数值
  • grep 命令之后定义了一个正则表达式

更准确地说,Unix 管道将第一个进程(echo命令)的标准输出提供给第二个命令(grep 命令)的标准输入。接受的字符是 0 到 9 之间的数字。除此之外,带有破折号的符号表明我们可以使用负数。

如果我们想为正数定义正则表达式,我们只需要删除破折号。因此,让我们展示两个调用先前脚本的示例。使用整数值,我们有:

$ ./integers.sh 123 
123

否则,使用字符串,我们得到:

$ ./integers.sh cat

正如我们所看到的,正则表达式正确地接受了整数值,并且正如预期的那样,它拒绝了这个词并且不在控制台上打印它。

2.2. 使用等号运算符

解决问题的另一种方法是使用等号波浪号(=~) 运算符。这允许在if语句中使用正则表达式:

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

布尔条件的右侧是扩展的正则表达式。如果左侧匹配,则运算符返回 0,否则返回 1。

让我们将这些最后的指令组合在一个名为ext-regexp.sh的脚本中并调用它:

$ ./ext-regexp.sh 1
$ ./ext-regexp.sh a 
error: Not a number

这意味着脚本正确地以状态 0 结束,以防我们使用数字。否则,它会报告错误并以状态 1 退出。

2.3. 匹配实数

我们可以简单地改变正则表达式的匹配规则来识别实数:

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

对于带符号的实数,我们需要使用:

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