如何在shell脚本中比较程序的版本?

Abh*_*ran 21 version shell-script test numeric-data

假设我想比较gcc版本以查看系统是否安装了最低版本。

为了检查gcc版本,我执行了以下操作

gcc --version | head -n1 | cut -d" " -f4
Run Code Online (Sandbox Code Playgroud)

输出是

4.8.5
Run Code Online (Sandbox Code Playgroud)

所以,我写了一个简单的if语句来检查这个版本与其他一些值

if [ "$(gcc --version | head -n1 | cut -d" " -f4)" -lt 5.0.0 ]; then
    echo "Less than 5.0.0"
else
    echo "Greater than 5.0.0"
fi
Run Code Online (Sandbox Code Playgroud)

但它抛出一个错误:

[: integer expression expected: 4.8.5
Run Code Online (Sandbox Code Playgroud)

我理解我的错误,我使用字符串进行比较并且-lt需要整数。那么,有没有其他方法可以比较版本?

Luc*_*ini 38

我不知道它是否漂亮,但它适用于我知道的每种版本格式。

#!/bin/bash
currentver="$(gcc -dumpversion)"
requiredver="5.0.0"
 if [ "$(printf '%s\n' "$requiredver" "$currentver" | sort -V | head -n1)" = "$requiredver" ]; then 
        echo "Greater than or equal to ${requiredver}"
 else
        echo "Less than ${requiredver}"
 fi
Run Code Online (Sandbox Code Playgroud)

注意:用户'通配符'的更好版本:https : //unix.stackexchange.com/users/135943/wildcard,删除了附加条件)

  • 起初我认为这很糟糕,然后我意识到 shell 脚本的美妙之处在于滥用这样的工具。+1 (6认同)
  • 如果打印语句中有 '%' 符号,这会中断。最好用 `printf '%s\n' "$requiredver" "$currentver"` 替换 `printf "$requiredver\n$currentver"`。 (2认同)

Mar*_*rcH 9

较短的版本:

version_greater_equal()
{
    printf '%s\n%s\n' "$2" "$1" | sort --check=quiet --version-sort
}

version_greater_equal "${gcc_version}" 8.2 || die "need 8.2 or above"
Run Code Online (Sandbox Code Playgroud)

  • (1) 这是已经给出的答案的一个微小变化。您可以通过添加尚未发布的解释来增加价值。(2) ``printf '%s\n'`` 就足够了;`printf` 将根据需要重复格式字符串。 (3认同)
  • 这是最好的解决办法! (2认同)
  • `die` 是您想要的任何错误处理函数。这是一个通用的名字。 (2认同)