这向您展示了如何在相当多的细节上进行文本提取和操作。我们基本上会从 /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 )
那么让我们看看发生了什么。我们假设我们在 repo 中有不止一个候选人的副本。
我们列出所有文件/ava/repo
并将其通过管道传输到 sed + awk 脚本,该脚本计算出它们的版本号并对它们进行排序,以便最后一个是最新的。
让我们看看每个部分
SED
步骤1:
-e 's/.*/&:&/'
创建两个由 分隔的名称副本:
。(我们将分割第一个并使用第 2 步和第 3 步将其减少到仅版本号。保持第二个完整,以便稍后使用 rpm 命令)
第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: where-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
瞧,我们有一个神奇的可比数字
排序和尾部
由于我们的 repo 中可能有多个文件,以上将是它们的列表,并且因为我们有幻数,我们可以使用它来获取最新的文件。用于sort -n
排序并用于tail -n1
抓取最后一个(排序为升序)。
所以现在在 AVAMAR_CANDIDATE 我们会有6040200 AvamarClient-6.4.200-400-x86_64
让我们让生活更轻松,并将其放入两个变量中:
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 }' )
现在您所要做的就是比较两个幻数的值:
if [ $AVAMAR_INSTALLED_MAGIC -lt $AVAMAR_CANDIDATE_MAGIC ] ; then
rpm -ivU /ava/repo/$AVAMAR_CANDIDATE_FILE
fi
我希望这能让你学习 shell 脚本,因为它是一个非常强大的工具。