我正在尝试编写一个BASH脚本来修补我的CentOS服务器。我的目标是当我运行脚本时,它输出包名,当前安装的版本和新的包版本。像这样:
nspr.x86_64 / 4.8.8-3.el6 / 4.8.9-3.el6_2
这样,如果我因为包裹破坏而需要降级,我会记录下来。
命令yum check-update
命令为我提供了上面列出的第一条信息(包名称)和第三条信息(新版本),我可以使用awk
将两者分开。之后很容易;只需运行rpm -q {package}
即可获取第二条信息,然后连接它们。
但是,我在代码中遇到for
循环时出现问题。我需要将多个参数传递给循环(包名称和更新的版本),以便稍后我可以echo
。
这是我的代码:
for package in `/usr/bin/yum --cacheonly --noplugins check-update | awk '{print $1, $2}'`;
do
OLD_VER=`rpm -q ${package}` # ${package} should actually be $1 from the awk statement above
NEW_VER=${2} # This is $2 from the awk statement above
echo "${package} / ${OLD_VER} / ${NEW_VER}"
done
请原谅代码中的明显错误;我是BASH脚本的新手。我的困惑主要源于awk;我不是很熟悉它,也不知道它是如何与BASH脚本交互的。但是,我认为很清楚我正在尝试做什么。 package
是否作为数组传递?有更好的方法吗?
答案 0 :(得分:2)
你想读全行:
/usr/bin/yum --cacheonly --noplugins check-update |
while read line; do
set - $line;
echo first: $1 second: $2
done
答案 1 :(得分:0)
试试这个:
/usr/bin/yum --cacheonly --noplugins check-update \
| awk '{package=$1; newVer=$2; cmd = "rpm -q " package; cmd | getline oldVer; close(cmd); print package " / " oldVer " / " newVer}'
你的脚本问题是虽然bash和awk都使用$
来引用变量,但它们是不同的变量,你不能从bash引用awk的$2
,反之亦然。用awk或bash编写所有内容应该可以解决问题。