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

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

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

  • 質問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

答え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の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...

答え2

~のため質問2(rpmdevtoolsがないためインストールできない場合):

最小インストールではyumが必要なので、PythonとrpmのPythonパッケージも必要です。次に、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/)単純なPythonスクリプトなので、rpmdevtoolsをインストールしなくても使用できます。

関連情報