2012-03-05 125 views
0

我正在尝试编写一个BASH脚本来修补我的CentOS服务器。我的目标是当我运行脚本时,它输出包名称,当前安装的版本和新的包版本。这样的事情:Bash脚本 - For循环多个参数和awk

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

解决办法之一就是在awk中完成整个事情 – 2012-03-05 11:25:50

回答

2

你想读整条生产线:

/usr/bin/yum --cacheonly --noplugins check-update | 
while read line; do 
    set - $line; 
    echo first: $1 second: $2 
done 
+2

你应该让'read'完成拆分; 'yum ... |同时阅读第一秒;做...' – tripleee 2012-03-05 12:06:50

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}' 

与你的脚本的问题是,虽然这两种庆典和awk使用$引用变量,它们是不同的变量,你不能从bash引用awk的$2,反之亦然。用awk或bash写所有东西都可以解决问题。

+0

有没有办法用我的当前脚本使用'set'来做到这一点?我刚刚发现这个例子:http://www.tldp.org/LDP/abs/html/loops1.html 如果你看,例11-2使用set命令分隔字符串输入。 – 2012-03-05 11:42:34

+0

是的,'设置$(yum ... | awk ...)'很简单。但是'while read'可能更优雅和可读。 – tripleee 2012-03-05 12:05:04