无法通过grep命令与正则表达式提取JDK版本问题排查
解决grep正则匹配JDK版本失效的问题
首先得指出你几个容易踩的坑,这也是为啥在线工具能用但grep不行的核心原因:
1. 混淆了grep -e和-E的作用
你提到用-e参数启用扩展正则,这是个误解!grep -e只是用来指定多个匹配表达式,真正启用扩展正则表达式(ERE)的是-E参数(或者直接用egrep命令)。如果不用-E,grep默认使用基础正则表达式(BRE),这时候像{1,2}这种量词需要转义成\{1,2\}才能生效,而你在在线测试工具里用的是PCRE(Perl兼容正则),语法和BRE差异很大,自然匹配失败。
2. 正则表达式里的多余空格
看你写的正则:^[0-9]{1,2}\. [0-9]{1,2}\. [0-9]{1,2}\. [0-9]{1,2}$,注意每个\.后面都加了空格,但实际JDK版本号是11.0.9.1,是点直接连接数字,没有空格!这应该是你输入时的笔误——虽然你说在线测试能匹配,但大概率是你在测试工具里用了正确的正则(无空格),写脚本时多打了空格。正确的正则应该是:
^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}$
3. 脚本里的其他小问题
cut -d '' -f 2是错误的,分隔符不能是空字符串,应该改成cut -d ' ' -f 2(用空格作为分隔符提取第2个字段);- 没必要循环遍历
$CMD_RESULT,因为java --version的第一行里,版本号本身就是一个连续的字段,直接对它做匹配即可。
修正后的脚本示例
VERSION_EXTRACTION_REGEX='^[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}$' CMD_RESULT=$(java --version 2>&1 | head -n 1 | cut -d ' ' -f 2) if [ ! -z "$CMD_RESULT" ]; then JAVA_VERSION=$(echo "$CMD_RESULT" | grep -E "$VERSION_EXTRACTION_REGEX") if [ ! -z "$JAVA_VERSION" ]; then printf "Java version: [$JAVA_VERSION]\n" fi fi
额外的优化建议
如果想让正则更灵活(比如兼容像17.0.2这种三位版本号,或者1.8.0_301这种旧版JDK格式),可以把正则改成:
^[0-9]+\.[0-9]+(\.[0-9]+)*([_-][0-9a-zA-Z]+)?$
这样能匹配更多格式的JDK版本号。
内容的提问来源于stack exchange,提问作者user14729562
相关产品推荐
相关产品推荐

