Bash脚本 - 用于循环多个参数和awk

时间:2012-03-05 11:19:00

标签: bash for-loop awk centos yum

我正在尝试编写一个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是否作为数组传递?有更好的方法吗?

2 个答案:

答案 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编写所有内容应该可以解决问题。