0

我正在维护一个 rpm 列表及其需要安装的版本

下面的示例包列表

#                  Package          Version              Release                                                     Filename
#----------------------------------------------------------------------------------------------------------------------------
               mongo-10gen            2.2.0      mongodb_1.x86_64                       mongo-10gen-2.2.0-mongodb_1.x86_64.rpm
        mongo-10gen-server            2.2.0      mongodb_1.x86_64                mongo-10gen-server-2.2.0-mongodb_1.x86_64.rpm
                      cpio             2.10       11.el6_3.x86_64                                cpio-2.10-11.el6_3.x86_64.rpm

我正在检查该软件包是否已安装,以及它是否是较低版本的更新 rpm 或者它是否不可用安装它。

pkg=($@)
vinfo=($(rpm -q --qf "%{VERSION}-%{RELEASE}.%{ARCH} " ${pkg[0]} 2>&1))
if [ $? -eq 0 ]
then
    need_upgrade=1
    for vrs in ${vinfo[@]}
    do
        if [[ "${pkg[1]}-${pkg[2]}" = "$vrs" ]]
        then
            need_upgrade=0
        elif [[ "${pkg[1]}-${pkg[2]}" < "$vrs" ]]
        then
            need_upgrade=0
        fi
    done
    if [ $need_upgrade -eq 1 ]
    then
        rpm -Uvh "$PKG_DIR/${pkg[3]}" >> $LOGFILE 2>&1
        rc=$?
    fi
else
    rpm -ivh "$PKG_DIR/${pkg[3]}" >> $LOGFILE 2>&1
    rc=$?
fi

但是字符串比较<是按字典顺序比较字符串,因此它没有按我期望的方式工作。在某些情况下,例如这里存在一个版本的 cpio 2.10-9.el6.x86_64。当它比较条件是否返回 true 时,它​​不会升级包"2.10-11.el6_3.x86_64" < "2.10-9.el6.x86_64"elif

有没有其他好的方法可以做到这一点?

4

2 回答 2

1

sort -VC,从人排序:

   -V, --version-sort
          natural sort of (version) numbers within text

   -C, --check=quiet, --check=silent
          like -c, but do not report first bad line

也许

if sort -VC <<END
${pkg[1]}-${pkg[2]}
$vrs
END
  then
于 2013-09-21T13:16:37.803 回答
0

awk可用于从输入中分离出 11 和 9 部分,然后进行比较。

这是示例脚本:

version=`echo "2.10-11.el6_3.x86_64" |  awk -F'.' '{print $2}' | awk -F'-' '{print 
$2}'`

versiontocompare=`echo "2.10-9.el6_3.x86_64" |  awk -F'.' '{print $2}' | awk -F'-' 
'{print $2}'`

# version contains 11 now and versiontocompare contains 9
echo "$version $versiontocompare"

if [ $version -gt $versiontocompare ]
then
  echo "Ok $version is greater than $versiontocompare. Do update"
else
 echo "Do not update"
fi
于 2013-09-21T13:23:40.833 回答