我想检查 shell 脚本的参数是否是整数(即非负整数:0、1、2、3、...、17、...、42、...等,但不是 3.1416 或 -5 ) 以十进制表示(所以没有 0x11 或 0x2A 之类的)。如何使用正则表达式作为条件(匹配数字)编写 case 语句?我尝试了几种不同的方法(例如,[0-9]+
或^[0-9][0-9]*$
);它们都不起作用。就像在下面的示例中一样,有效数字正在通过旨在捕获它们并匹配 *
通配符的数字正则表达式。
i=1
let arg_n=$#+1
while (( $i < $arg_n )); do
case ${!i} in
[0-9]+)
n=${!i}
;;
*)
echo 'Invalid argument!'
;;
esac
let i=$i+1
done
输出:
$ ./cmd.sh 64
Invalid argument!
case
不使用正则表达式,它使用模式对于“1 个或多个数字”,请执行以下操作:
如果要使用正则表达式,请使用其中的
=~
运算符[[...]]
正如 glenn 所说,“
case
不使用正则表达式,它使用模式”。正如bash(1)所说,同样,POSIX 规范说,
所以这些模式是路径名扩展模式,又名通配符,又名 glob,如
ls -l -- *.sh
orrm -- *.bak
。当然,
shopt -s extglob
并且[[ … =~ … ]]
是自切片面包以来最整洁的东西,但它们不是 POSIX,知道如何使用原始工具会很有用。多年来,例如,程序员通过检查字符串是否不是数字来检查字符串是否为数字。您已将数字定义为(完全)由一个或多个数字组成的字符串。因此,如果字符串为空或包含非数字字符,则字符串不是数字。case
我们可以使用如下语句来测试这些条件:where
[!0-9]
是老式的 shell 说法[^0-9]
,当然,它表示除数字之外的任何字符。([!…]
并且[^…]
两者都在 bash.[!…]
中工作,POSIX 要求工作;结果[^…]
未指定。)如果您不关心字符串是哪种非数字,您可以组合非数字模式:作为练习,这里有一个
case
处理任何类型实数的语句 - 准确地说,是一个或多个数字的字符串,在某处可选带句点 ( ),开头.
可选带减号 ( )。-
我添加了
case
-within-a-case
来验证字符串确实包含至少一个数字。在整数示例中这不是必需的,因为我测试了字符串是否为空;我已从该声明中删除的测试。没有第二个case
,一个-
或一个.
——甚至-.
——将有资格作为一个数字。当然,我们可以添加模式来处理这些异常,但这会变得复杂。(例如,我几乎发布了这个答案,却没有意识到这-.
是例外之一。)我相信上述方法更加灵活和健壮。当然非数字模式也可以在这里组合:
(*[!-.0-9]* | *?-* | *.*.*)
.要将statements中的数字与正则表达式匹配
case
,您需要一个其通配符支持正则表达式的 shell。我只知道ksh93和那些。使用 ksh93 glob,您可以在 glob 模式中执行
~(E)^[0-9]+$
或~(E:^[0-9]+$)
使用扩展正则表达式,或使用类似 perl 的正则表达式(也适用于基本正则表达式、增强正则表达式、SysV 正则表达式)。E
~(P)^\d+$
G
X
V
所以: