2012-03-05 4 views
0

내 CentOS 서버를 패치하기위한 BASH 스크립트를 작성하려고합니다. 내 목표는 스크립트를 실행할 때 패키지 이름, 현재 설치된 버전 및 새 패키지 버전을 출력한다는 것입니다. 이런 식으로 뭔가 : 나는 이제까지 패키지가 뭔가를 부러 때문에 다운 그레이드해야하는 경우Bash 스크립트 - 루프 다중 인수 및 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이 배열로 전달 되나요? 이 작업을 수행하는 더 좋은 방법이 있습니까? 배쉬와 AWK 사용 $ 모두 변수를 참조 할 수 있지만

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

, 서로 다른 스크립트에 문제가있는 것을이 시도

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

하나의 해결책은 awk에서 모든 것을 수행하는 것입니다. –

답변

2

당신은 전체 라인을 읽을 수 vars와 bash에서 awk의 $2을 참조 할 수 없으며 그 반대도 마찬가지입니다. awk 또는 bash에 모두 쓰면이 문제를 해결할 수 있습니다.

+2

'읽기'가 분할을 수행하도록해야합니다. '얌 ... | 첫 번째 두 번째 읽는 동안; do ... ... ' – tripleee

0

:

+0

현재 스크립트에서'set'을 사용하여 이것을 수행 할 수 있습니까? 방금 찾은이 예제는 다음과 같습니다. http://www.tldp.org/LDP/abs/html/loops1.html 예 11-2는 set 명령을 사용하여 문자열 입력을 구분합니다. –

+0

네,'set $ (yum ... | awk ...)'아주 간단합니다. 그러나'읽는 동안'은 더 우아하고 읽기 쉽다. – tripleee