首页 > 解决方案 > 排序在 bash 中无法正常工作

问题描述

我有一个VarExp具有以下 2 个值的变量

1.5.2
1.5.3

我有另一个VarCurr具有以下 1 值的变量

1.8.1

我想比较VarCurr并且VarExp只想echo SUCCESS

VarCurr >= VarExp

我已经编写了以下代码,但它总是返回FAILURE

VarExp='1.5.2 1.5.3'
VarCurr='1.8.1'

printf -v versions '%s\n%s' "$VarExp" "$VarCurr"
if [[ $versions = "$(sort -V <<< "$versions")" ]]; then
    echo 'FAILURE'
else
    echo 'SUCCESS'
fi

VarCurr需要 >= 中包含的最小值VarExp

标签: bashshellawksedgrep

解决方案


我建议使用能够正确客观化版本对象并且可以理解major.minor.build.revision 的语言。这是一个从 Perl 借用的示例 bash 脚本进行版本解析:

#!/bin/bash

VarExp='1.5.2 1.5.3'
VarCurr='1.8.1'

for i in $VarExp; do {
    perl -e 'use version;exit !(version->parse('$VarCurr') >= version->parse('$i'));' && {
        echo 'SUCCESS'
        exit
    }
}; done

echo 'FAILURE'
exit

当然,用 Perl 编写整个内容可能更优雅。

编辑:这是另一个使用 Python 的示例:

#!/bin/bash

VarExp='1.5.3 1.5.6'
VarCurr='1.5.3'

for i in $VarExp; do {
    python -c 'from distutils.version import LooseVersion;\
    exit(LooseVersion("'$VarCurr'") >= LooseVersion("'$i'"))' || {
        echo 'SUCCESS'
        exit
    }
}; done

echo 'FAILURE'
exit

推荐阅读