检查变量是否是Bash中的数字
Contents
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]+)?$