これは、テキストの抽出と操作をかなり詳細に行う方法を示しています。基本的に、/ava/repo 内の候補ファイルからバージョンを抽出し、次の式を使用して比較に使用できる番号に変換します。
AVAMAR_INSTALLED_MAGIC=$((1000000 * $AVAMAR_INSTALLED_VER_MAJ + 10000 * $AVAMAR_INSTALLED_VER_MIN + $AVAMAR_INSTALLED_VER_REL))
この数値形式を使用して、最初に /ava/repo にある最新バージョンを把握し、それをインストールしたバージョンと比較して、それを置き換えるかどうかを確認します。
だからここに行きます:
これは複雑です
まず全体:
AVAMAR_CANDIDATE=$(ls -1 /ava/repo/AvamarClient* | \
sed -e 's/.*/&:&/' \
-e 's/-[0-9]*-x86_64//1' \
-e 's/AvamarClient-//' \
-e 's/\./:/1' -e 's/\./:/1' | \
awk -F: '{ print 1000000 * $1 + 10000 * $2 + $3 " " $4 }' | \
sort -n | tail -n1 )
それでは、何が起こっているのか見てみましょう。リポジトリに候補のコピーが複数あると仮定します。
のすべてのファイルを一覧表示し、/ava/repo
それを sed + awk スクリプトにパイプします。このスクリプトは、バージョン番号を把握し、最後のファイルが最新のものになるように並べ替えます。
各パーツを見ていきましょう
SED
ステップ1:
-e 's/.*/&:&/'
で区切られた名前の 2 つのコピーを作成します:
。(最初のものを切り離し、ステップ 2 と 3 を使用してバージョン番号だけに減らします。後で rpm コマンドを使用するために 2 番目のものはそのままにしておきます)
ステップ2:
-e 's/-[0-9]*-x86_64[^:]*//1'
正確には、ファイル名の最初のコピーから単語を削除します。以前に挿入した (コロンは除く)-NNN-x86_64.rpm
までの末尾のビットを削除します。:
ステップ 3:
-e 's/AvamarClient-//'
AvamarClient-
ファイル名の最初のコピーから単語を取り除く
ステップ 4:
-e 's/\./:/1' -e 's/\./:/1'
抽出.
されたバージョン番号のみを:
たとえば、次のようになります。
ls -1 /ava/repo/AvamarClient-6.4.200-400-x86_64.rpm | sed -e 's/.*/&:&/' -e 's/-[0-9]*-x86_64[^:]*//1' -e 's/AvamarClient-//' -e 's/\./:/1' -e 's/\./:/1'
出力します:
6:4:200:AvamarClient-6.4.200-400-x86_64.rpm
AWK
抽出されたバージョンを魔法のようなものに変換するために、 awk: を介してそれをプッシュします。ここで-F:
は、区切り文字として : を使用して上記の文字列を分割します。つまり、$1 = MAJ、$2 = MIN、$3 = REL、$4 = ファイル名です。たとえば、上記では $1 = 6; となります。$2 = 4; $3 = 200; $4 = AvamarClient-6.4.200-400-x86_64.rpm
そこで、魔法の公式を適用して、ファイル名を awk に出力します。
'{ print 1000000 * $1 + 10000 * $2 + $3 " " $4 }'
したがって、上記の例では、次のように出力されます。
6040200 AvamarClient-6.4.200-400-x86_64
そしてほら、魔法の匹敵する数があります
ソートとテール
リポジトリには複数のファイルがある可能性があるため、上記はそれらのリストになります。マジック ナンバーがあるため、それを使用して最新のファイルを取得できます。を使用sort -n
して並べ替え、tail -n1
最後のものを取得するために使用します (並べ替えは昇順です)。
したがって、AVAMAR_CANDIDATE では次のようになります。6040200 AvamarClient-6.4.200-400-x86_64
生活を楽にして、これを 2 つの変数に入れましょう。
AVAMAR_CANDIDATE_FILE=$(echo $AVAMAR_CANDIDATE | cut -f2 -d' ')
AVAMAR_CANDIDATE_MAGIC=$(echo $AVAMAR_CANDIDATE | cut -f1 -d' ')
インストールされたバージョンで同じことをしましょう:
AVAMAR_INSTALLED=$(rpm -qa | grep AvamarClient)
AVAMAR_INSTALLED_MAGIC=$(echo $AVAMAR_INSTALLED | \
sed -e 's/^AvamarClient-//' \
-e 's/-[0-9].*x86_64$//' \
-e 's/\./:/g' | \
awk -F: '{ print 1000000 * $1 + 10000 * $2 + $3 }' )
あとは、2 つのマジック ナンバーの値を比較するだけです。
if [ $AVAMAR_INSTALLED_MAGIC -lt $AVAMAR_CANDIDATE_MAGIC ] ; then
rpm -ivU /ava/repo/$AVAMAR_CANDIDATE_FILE
fi
シェル スクリプトは驚くほど強力なツールであるため、これを使用してシェル スクリプトを学習できるようになることを願っています。