根据列表中提到的版本安装/升级rpm

时间:2013-09-21 10:50:00

标签: bash shell installation upgrade rpm

我正在维护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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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