bash regex与语义版本号匹配

bash regex与语义版本号匹配,regex,bash,semantic-versioning,Regex,Bash,Semantic Versioning,我有以下资料: versionNumber=$(sw_vers -productVersion) # Finds version number versionShort=${versionNumber:0:4} # Cut string to 1 decimal place for calculation 当版本如下所示时,该选项有效: 10.9.2 10.9.5 但它不会匹配 10.10.3 因为它只会回来 10.1 但是我想把versionShort设置为 10.10 我想匹配

我有以下资料:

versionNumber=$(sw_vers -productVersion) # Finds version number

versionShort=${versionNumber:0:4}  # Cut string to 1 decimal place for calculation
当版本如下所示时,该选项有效:

10.9.2
10.9.5
但它不会匹配

10.10.3
因为它只会回来

10.1
但是我想把versionShort设置为

10.10

我想匹配上面的主版本、第一个点和次版本。

regexpress解决方案-切掉最后一个点及其后面的内容:

versionShort=${versionNumber%.*}
Regexp解决方案:

[[ $versionNumber =~ ^[0-9]+\.[0-9]+ ]] && echo "${BASH_REMATCH[0]}"
它将始终打印前两个数字,例如:

10.5
10.5.9
10.5.8.2
将导致
10.5
输出。您还可以添加一个
else
子句来检查是否发生了错误(未找到匹配项)

下面是一个较长的版本:

if [[ $versionNumber =~ ^[0-9]+\.[0-9]+ ]]; then
    versionShort=${BASH_REMATCH[0]}
else
    echo "Something is wrong with your version" >&2
fi

我有一个类似的问题,但我需要访问所有3个部分。我做了一些研究和测试,我发现这很有效

product_version=$(sw_vers -productVersion)
semver=( ${product_version//./ } )
major="${semver[0]}"
minor="${semver[1]}"
patch="${semver[2]}"
echo "${major}.${minor}.${patch}"
要直接回答这个问题,您可以

product_version=$(sw_vers -productVersion)
semver=( ${product_version//./ } )
major="${semver[0]}"
minor="${semver[1]}"
patch="${semver[2]}"
versionShort="${major}.${minor}"
或者可以使用更少的变量

product_version=$(sw_vers -productVersion)
semver=( ${product_version//./ } )
versionShort="${semver[0]}.${semver[1]}"

SEMVER\u REGEX=“^(0-124;[1-9][0-9]*)\.(0-124;[1-9][0-9]*)\.(0-124;[1-9][0-9]*)(\-[0-9A-Za-z-]+(\\.[0-9A-Za-z-])?(\+[0-9A-Za-z-]+(\\.[0-9A-Za-z-])*)?”
函数验证版本{
本地版本=$1
如果[[“$version”=~$SEMVER\u REGEX]];则
#如果传递了第二个参数,则将结果存储在以$2命名的var中
如果[“$#”-等式“2”];则
本地大调=${BASH_重赛[1]}
本地小调=${BASH_重赛[2]}
本地补丁=${BASH_重新匹配[3]}
本地prere=${BASH_重新匹配[4]}
本地生成=${BASH_重新匹配[5]}
评估“$2=(\“$major\”\“$minor\”\“$patch\”\“$prere\”\“$build\”)
其他的
回显“$version”
fi
其他的
错误“版本$version与semver方案“X.Y.Z(-PRERELEASE)(+BUILD)”不匹配。有关详细信息,请参阅帮助。”
fi

}
如何将结果返回到变量?@lukemm我添加了一个更长的版本,可能对您更清楚。如果它不起作用。。。你确定你在用bash吗?如果是,那么是哪个版本?在版本3中,必须将条件表达式的右侧放入变量中。标签必须正好有3个数字。@MikeSamuel是的,没错。请随意编辑答案。我希望完全删除它更容易,但是提到
BASH_REMATCH
是一个值得的目标,即使有这样一个糟糕的答案……或者写你自己的,我将删除我的:)semver=(${product_version/././})如何工作?很遗憾,当我尝试此操作时,我得到了semver=“10.11.6/./”。@JasonHarrison代码的工作方式是将点“.”替换为空格“”,然后将所有参数作为bash数组。为了让它工作,您需要首先将semver文本分配给一个变量。例如,
a=“10.11.6”;semver=(${a/./})
注意:此代码段包含在GNU GPL v3下许可的代码: