在写一个自动配置脚本时,我需要判断某个软件版本是否符合我的要求。例如,需要的最低版本满足($version ≥ 1.3.2),或者在某个版本范围(1.1.4 ≤ $version ≤ 2.4.3)。
版本号的格式一般是”X.Y.Z”,它是一个字符串。
在bash shell中,最简单的方法是使用sort命令,带”-V”选项。
sort命令的例子:
创建一个文件ver_test.txt:
1 2 3 4 5 |
2.3.5 0.3.1 1.2.3 3.0.0 2.5.1 |
sort命令排序:
1 2 3 4 5 6 |
$ sort -V ver_test.txt 0.3.1 1.2.3 2.3.5 2.5.1 3.0.0 |
默认是从小到大,可以使用”-rV”选项逆序:
1 2 3 4 5 6 |
$ sort -rV ver_test.txt 3.0.0 2.5.1 2.3.5 1.2.3 0.3.1 |
下面我们看看怎么用sort比较版本号
比较版本号的bash脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#!/bin/bash VERSION1=$1 VERSION2=$2 # V1 > V2 function version_gt() { test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1"; } # V1 >= V2 function version_ge() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"; } # V1 <= V2 function version_le() { test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" == "$1"; } # V1 < V2 function version_lt() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" != "$1"; } if version_gt $VERSION1 $VERSION2; then echo "$VERSION1 > $VERSION2" fi if version_ge $VERSION1 $VERSION2; then echo "$VERSION1 >= $VERSION2" fi if version_le $VERSION1 $VERSION2; then echo "$VERSION1 <= $VERSION2" fi if version_lt $VERSION1 $VERSION2; then echo "$VERSION1 < $VERSION2" fi |
- 大于:version_gt
- 大于等于:version_ge
- 小于等于:version_le
- 小于:version_lt
测试: