我正在维护一个 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
有没有其他好的方法可以做到这一点?