如何在 shell 脚本中查找存储库中软件包的最新版本?如果我使用apt-cache-policy
,我会将安装的版本作为“候选”,而不是存储库中的最新版本。
apt-cache policy nvidia-current
显示:
nvidia-current:
Installed: 280.13-0ppa~natty1
Candidate: 280.13-0ppa~natty1
Version table:
*** 280.13-0ppa~natty1 0
100 /var/lib/dpkg/status
270.41.06-0ubuntu1 0
500 http://archive.ubuntu.com/ubuntu/ natty/restricted amd64 Packages
似乎已安装的版本标有***
,因此必须忽略该版本。也许有一个可以使用的 awk 脚本?
答案1
我建议使用以下 awk 脚本,将 apt-cache 策略输出提供给该脚本:
#!/usr/bin/awk -f
/^ [^ ]/ {
version = $1
}
/^ \*\*\* [^ ]/ {
version = $2
}
/^ [^ ]/ {
server = $2
if (server !~ /^\//) {
print version
exit
}
}
答案2
以下命令似乎有效:
LANG=C apt-cache policy nvidia-current | grep '^ [^ ]' |\
sort | awk '{print $1}' | head -1
LANG=C
确保输出在不同语言环境中保持一致。grep
匹配一组空格后跟一个非空格字符(例如版本)。awk
显示第一个非空白块的版本。接下来,对输出进行排序,最新版本应该位于顶部,由 占用head
。
答案3
你可能想看看rmadison
#! /bin/bash
DEFAULT_DIST="$(ubuntu-distro-info --stable)"
PACKAGE="$1"
TARGET_DIST="$2"
ARCH="$(dpkg --print-architecture)"
if [ -z "$1" ]; then
echo "Usage: $0 <PACKAGE> <DIST>"
exit
fi
if [ -z "$TARGET_DIST" ]; then
TARGET_DIST=$DEFAULT_DIST
echo "Target dist not specified. Assuming $DEFAULT_DIST."
fi
VERSION="$(rmadison $PACKAGE -a $ARCH | grep $TARGET_DIST | cut -d "|" -f 2)"
echo $VERSION
或者单行:
rmadison nvidia-current -a amd64 | grep natty | cut -d "|" -f 2