我正在维护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时,它不会升级包。
有没有其他好方法可以做到这一点?
答案 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