내 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
하나의 해결책은 awk에서 모든 것을 수행하는 것입니다. –