2012-03-05 16 views
0

私のCentOSサーバーにパッチを当てるためのBASHスクリプトを作成しようとしています。私の目標は、スクリプトを実行すると、パッケージ名、現在インストールされているバージョン、および新しいパッケージのバージョンを出力することです。このような何か:Bashスクリプト - ループの複数の引数とawkについて

nspr.x86_64/4.8.8-3.el6/4.8.9-3.el6_2 

この方法では、私が今までダウングレードする必要がある場合は、パッケージが何かを壊したので、私はこれの記録を持っています。

コマンドyum check-updateコマンドは私に、上記情報の第一部分(パッケージ名)と情報の第三枚(新バージョン)を与える、と私は2つを分離するためにawkを使用することができます。その後は簡単です。 rpm -q {package}を実行して2番目の情報を取得し、連結してください。

しかし、自分のコードで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は配列として渡されますか?これを行うより良い方法はありますか?

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

1つの解決策はawkですべてを行うことです。 –

答えて

2

スクリプトで

/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を使用$ものの、彼らは異なっているということでしたvarsからawkの$2をbashから参照することはできません。 awkまたはbashのいずれかにすべてを書き込むことで問題を解決する必要があります。

+2

「読み込み」に分割を実行する必要があります。 'yum ... |最初の2番目に読み込み中。 do ... ... – tripleee

0

はこのお試しください:あなたは全体のライン読みたい

+0

'set'を使って私の現在のスクリプトでこれを行う方法はありますか?私はちょうどこの例を見つけました:http://www.tldp.org/LDP/abs/html/loops1.html 例11-2では、setコマンドを使用して文字列入力を区切ります。 –

+0

はい、 '$(yum ... | awk ...)'をかなり単純に設定します。しかし、「読んでいる間」はよりエレガントで読みやすいかもしれません。 – tripleee

関連する問題