【转载】shell 版本号比较_用shell如何比较软件版本号的大小
本文来源链接:http://www.linuxdown.net/install/faq/20160319_how_linux_5069.html

比如你想写个脚本来比较两个版本号 (如"1.2.30" 和"1.3.0")来辨认哪个版本是最新的,有可以比较两个版本号字符串的shell脚本吗?

当你写了一个shell脚本,想使用脚本来比较两个版本号,然后能区分哪个版本号更高哪个版本号更低。比如,你安装某个软件的时候,要求是版本号要大于1.3.0,想验证最低配置要求.又或者你想在shell脚本中写版本号判断(比如版本号如果介入1.0.0 ≤ 版本 ≤ 2.3.1).

如果你想通过shell来比较两个版本号字符串的话最简单的就是使用sort命令。加上参数"-V"后sort命令就可以把文本中的版本号给排序出来(默认是递增的排序),然后你想倒叙排序的话那就使用参数"-rV"即可.

img

下面我们就来看下在shell中怎么使用sort命令来比较版本号吧。

对于要比较版本号字符串的话,下面的这些使用了sort命令的自定义函数可能会派上用场。

function version_gt() { test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1"; }
function version_le() { test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" == "$1"; }
function version_lt() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" != "$1"; }
function version_ge() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"; }

上面的脚本主要是比较两个不同版本的文本,会得出大于、等于、小于、大于等于等结果。你可以根据自己的需要使用自定义函数。

下面是一个比较的示例。

#!/bin/bash
# -*- coding: utf-8 -*-
# @Time         : 2021/8/7 12:54
# @Description  : Version_check

VERSION="v1.1"
VERSION2="v1.2"

function version_gt() { test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1"; }
function version_le() { test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" == "$1"; }
function version_lt() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" != "$1"; }
function version_ge() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"; }

# 上面的脚本主要是比较两个不同版本的文本,会得出大于、等于、小于、大于等于等结果。你可以根据自己的需要使用自定义函数。

if version_gt "$VERSION" "$VERSION2"; then
  echo "$VERSION is greater than(大于) $VERSION2"
fi

if version_le "$VERSION" "$VERSION2"; then
  echo "$VERSION is less than or equal to(小于等于) $VERSION2"
fi

if version_lt "$VERSION" "$VERSION2"; then
  echo "本地版本 $VERSION is less than(小于) 远程版本 $VERSION2,可以更新。"
else
  echo "本地版本 $VERSION 与 远程版本 $VERSION2 相同,无需更新!"
fi

if version_ge "$VERSION" "$VERSION2"; then
  echo "$VERSION is greater than or equal to(大于或等于) $VERSION2"
fi

优化代码,封装了一个函数

#!/bin/bash
# -*- coding: utf-8 -*-
# @Time         : 2021/8/7 12:54
# @Description  : Version_check

LOCAL_VERSION="v1.1"
REMOTE_VERSION="v1.2"

function version_compare() {
    if [[ "$1" == "$2" ]]; then
        echo "本地版本 $1 与 远程版本 $2 相同,无需更新!"
        return 0
    fi

    if [[ "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" == "$1" ]]; then
        echo "本地版本 $1 小于 远程版本 $2,可以更新。"
        return 1
    else
        echo "本地版本 $1 大于 远程版本 $2,无需更新!"
        return 2
    fi
}

# 比较本地版本和远程版本的大小
version_compare "$LOCAL_VERSION" "$REMOTE_VERSION"

# 比较两个自定义版本号的大小
version_compare "1.0" "1.0"
version_compare "1.1.1" "1.0"
version_compare "1.2" "1.2.4"

运行提示

本地版本 v1.1 小于 远程版本 v1.2,可以更新。
本地版本 1.0 与 远程版本 1.0 相同,无需更新!
本地版本 1.1.1 大于 远程版本 1.0,无需更新!
本地版本 1.2 小于 远程版本 1.2.4,可以更新。

在if语句的判断条件中,使用了两个条件判断语句:

  1. [[ "$1" == "$2" ]]:这是一个字符串相等的判断语句,判断第一个参数$1是否等于第二个参数$2。如果相等,则返回0,表示条件成立;否则返回非0值,表示条件不成立。
  2. $(printf '%s\n' "$1" "$2" | sort -V | head -n1) == "$1":这是一个版本号比较的判断语句。它使用了管道符|将两个命令串联起来:

    • 第一个命令printf '%s\n' "$1" "$2"将两个参数以每行一个的格式输出。
    • 第二个命令sort -V将这两个版本号按照数字大小排序,其中-V选项表示按照版本号的数值大小排序。
    • 第三个命令head -n1取排序后的第一行,即较小的版本号。

    然后,判断较小的版本号是否等于第一个参数$1。如果相等,则返回0,表示条件成立;否则返回非0值,表示条件不成立。