在 case 语句中匹配有效的版本号

Use*_*123 1 bash regular-expression case pattern-matching

我想在case语句中匹配一个版本号。版本号可能如下所示

1.12.0.32
1.12.0.32.1
2.10.0.30.1.2
Run Code Online (Sandbox Code Playgroud)

并存储在一个 shell 变量中:version.

正如我在互联网上搜索的那样,在 -case语句中匹配正则表达式并不困难。但是,有没有人有想法或可以帮助说明如何在case-statement 中完成?

我尝试了以下方法,但没有奏效:

1.12.0.32
1.12.0.32.1
2.10.0.30.1.2
Run Code Online (Sandbox Code Playgroud)

ilk*_*chu 7

case仅支持 shell 模式,不支持正则表达式。但是 Bash 支持开箱即用的具有不同语法的正则表达式。

如果您的意思是“由点分隔的任意数量的十进制数字”,并且例如没有尾随字母或标签,那么该模式^[0-9]+(\.[0-9]+)*$可能是合适的。([0-9]+\.*)+还将匹配带有连续点或尾随点的字符串,例如1.2..3.. 所以:

#!/bin/bash
re='^[0-9]+(\.[0-9]+)*$';
if [[ $version =~ $re ]]; then
    echo "'$version' matches the pattern"
else
    echo "'$version' doesn't match"
fi
Run Code Online (Sandbox Code Playgroud)

正则表达式表示要查找任意数量的十进制数字 ( [0-9]+),然后是任意数量的组 ( (·)*) ,这些组 ( ) 由文字点 ( \.) 和任意数量的十进制数字 ( [0-9]+) 组成。^并将$模式锁定到字符串的开头和结尾,否则匹配的子字符串就足以进行匹配。

这将允许没有任何点的版本字符串,例如123. 如果您想至少需要两个数字和点,请使用^[0-9]+(\.[0-9]+)+$(将最后*一个更改为 a +)。

请注意,根据区域设置,[0-9]匹配的内容可能有点令人惊讶,它可能包含一些更奇怪的 Unicode 数字。拼出允许的字符 with[0123456789]会更严格,但写起来更笨拙且容易出错。


row*_*oat 6

case匹配 shell 模式,而不是正则表达式。因此,^[0-9]+(\.[0-9]+)*$您可以使用以下正则表达式代替:

case $version in
  '' | *[!0123456789.]* | .* | *. | *..* ) echo invalid;;
  * ) echo fine;;
esac
Run Code Online (Sandbox Code Playgroud)

即“反转”匹配意义,使用标准外壳模式来检测无效情况。

请注意,extglobbash 选项适用于匹配 incase语句。因此,如果您设置了shopt -s extglob,那么那些扩展模式(如+()*()等)将获得它们的特殊含义,并且您可以通过使用+([0123456789])*(.+([0123456789]))(外壳模式已经“锚定”到开头和结尾)来进行更像正则表达式的正匹配。