rpm이 최소한 특정 버전인지 확인하는 Bash 스크립트

rpm이 최소한 특정 버전인지 확인하는 Bash 스크립트

RPM이 최소한 Linux에서 특정 버전인지 확인하는 스크립트를 작성해야 합니다.

  • 질문 1:".src.rpm"까지의 버전을 포함하도록 변수 $RPM_VERSION에서 RPM 버전을 어떻게 구합니까?
  • 질문 2:이 두 버전을 비교하는 가장 좋은 방법은 무엇입니까?

예: rpm-4.2-9.69.src.rpm을 rpm-4.14-0.69.src.rpm과 비교합니다. 이것은 내 시도이지만 작동하지 않습니다.

STR_BASE_ACCEPTABLE_VER="rpm-4.2-0.69.src.rpm"

if  [[ "$RPM_VERSION" < "$STR_BASE_ACCEPTABLE_VER" ]]; then   
    echo "$RPM_VERSION is too low..."  \
else   
    echo "$RPM_VERSION is fine"  \
fi

답변1

구문 분석된 버전

해키 방식

첫 번째 부분에서는 아래와 같이 RPM에 특정 버전 정보를 쿼리하겠습니다.

$ rpm -qi vim-enhanced | grep Version
Version     : 7.4.417

그러면 다음과 같이 구문 분석할 수 있습니다.

$ rpm -qi vim-enhanced | awk -F': ' '/Version/ {print $2}'
7.4.417

이는 다음과 같은 변수로 캡처될 수 있습니다.

$ RPM_VERSION=$(rpm -qi vim-enhanced | awk -F': ' '/Version/ {print $2}')

$ echo $RPM_VERSION
7.4.417

쿼리 형식 사용

이 도구는 생성되는 출력을 사용자 정의할 수 있는 rpm도구도 제공합니다 . 이를 알고 있으면 다음과 같이 "VERSION" 매크로를 인쇄 --queryformat할 수 있습니다 .rpm

$ rpm -q --queryformat '%{VERSION}' vim-enhanced
7.4.417

변수에 넣으십시오.

$ RPM_VERSION=$(rpm -q --queryformat '%{VERSION}' vim-enhanced)

노트:--querytags스위치를 사용하여 모든 쿼리 태그를 볼 수 있습니다 rpm. 예를 들면 다음과 같습니다.

$ rpm --querytags | head -5
ARCH
ARCHIVESIZE
BASENAMES
BUGURL
BUILDARCHS

버전 비교

비교가 더 까다로워질 것입니다. 다행히 rpmdevtools패키지에는 rpmdev-vercmp.

용법

$ rpmdev-vercmp --help

rpmdev-vercmp <epoch1> <ver1> <release1> <epoch2> <ver2> <release2>
rpmdev-vercmp <EVR1> <EVR2>
rpmdev-vercmp # with no arguments, prompt

Exit status is 0 if the EVR's are equal, 11 if EVR1 is newer, and 12 if EVR2
is newer.  Other exit statuses indicate problems.

반환된 종료 상태를 확인하면 도구에 요청하고 RPM의 두 가지 이름을 제공하여 어떤 버전이 최신인지 확인할 수 있습니다.

$ rpmdev-vercmp rpm-4.2-9.69 rpm-4.14-0.69
rpm-4.2-9.69 < rpm-4.14-0.69
$ echo $?
12

따라서 종료 코드 12를 기준으로 두 번째 매개변수는 2개의 매개변수 중 최신 매개변수가 됩니다.

함께 넣어

귀하의 솔루션은 다음과 같습니다

rpmdev-vercmp $RPM_VERSION $STR_BASE_ACCEPTABLE_VER > /dev/null
if [[ $? == 12 ]]; then
  echo "$RPM_VERSION is too low..."
else 
  echo "$RPM_VERSION is fine"
fi

따라서 변수를 다음과 같이 설정하면:

$ STR_BASE_ACCEPTABLE_VER="rpm-4.2-9.69"
$ RPM_VERSION="rpm-4.14-0.69"

$ ./cmp_rpmvers.bash    
rpm-4.14-0.69 is fine

교체하는 경우:

$ STR_BASE_ACCEPTABLE_VER="rpm-4.14-0.69"
$ RPM_VERSION="rpm-4.2-9.69"

$ ./cmp_rpmvers.bash
rpm-4.2-9.69 is too low...

답변2

~을 위한질문 2(rpmdevtools가 없어 설치할 수 없는 경우):

최소 설치에서는 yum이 있어야 하므로 Python과 rpm Python 패키지도 있어야 합니다. 그런 다음 두 버전을 비교하면 다음과 같습니다.

python -c "import sys,rpm; print rpm.labelCompare((None, '$VER1', '$REL1'), (None, '$VER2', '$REL2'));"

"rpm-4.14-0.69" 패키지 이름이 주어지면 $VER는 버전 부분(4.14)이고 $REL은 릴리스 부분(0.69)입니다. 패키지 이름을 "-"로 구분하여 추출할 수 있습니다. 귀하의 예제에는 패키지 이름에 epoch가 포함되어 있지 않기 때문에 여기서는 epoch 부분을 None으로 설정했습니다.

labelCompare의 결과는 0, 1 또는 -1입니다.

실제로 rpmdev-vercmp 또는 rpmdev-sort(https://fedorahosted.org/releases/r/p/rpmdevtools/) 간단한 Python 스크립트이므로 rpmdevtools를 설치하지 않고도 사용할 수 있습니다.

관련 정보