web-dev-qa-db-ja.com

rpmが少なくとも特定のバージョンであることを確認するBashスクリプト

LinuxでRPMが少なくとも特定のバージョンであることを確認するスクリプトを作成する必要があります。

  • 質問1:「.src.rpm」までのバージョンが含まれるように、変数$ RPM_VERSIONでRPMバージョンを取得するにはどうすればよいですか?
  • 質問2: 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
5
bashquestion

バージョンの解析

ハッキーウェイ

最初の部分では、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

Queryformatsの使用

rpmツールは、--queryformatと呼ばれる機能も提供し、生成する出力をカスタマイズできます。これを知っていれば、rpmに「VERSION」マクロを次のように出力するように指示できます。

$ 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の2つの名前を指定するだけで、どのバージョンが新しいかを確認できます。

$ 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番目の引数は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...
6
slm

質問#2の場合(rpmdevtoolsがなく、インストールできない場合):

最小限のインストールでは、yumが必要です。したがって、python and rpm python packageも必要です。2つのバージョンを比較すると、次のようになります。

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/ )をダウンロードして、rpmdevtoolsをインストールせずに使用することもできます。これらは単純なpythonスクリプトです。

2
Qwerty