2012-03-05 57 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