我有一个包含版本文件version.txt的tgz文件。该文件只有一行“version = 1.0.0”。此tgz文件存在于两个不同的目录中,并且具有相同的名称。
我的要求是我需要使用bash脚本和awk来确定这两个tgz文件中哪一个是最新版本。即,具有1.0.0的tgz文件的版本低于具有版本1.0.1的文件。
答案 0 :(得分:1)
使用tar -xzvf /mnt/cf/bundle.tgz -O version.txt
提取版本。
棘手的部分是如何处理版本。如果你的版本总是三位数,那么我建议将每个部分乘以1000.这将为你提供一个可以轻松比较的大数字。即1.0.0 == 1000000000; 1.0.1 = 1000000001。另一个选项是使用%04d:0001.0000.0000和0001.0000.0001格式化每个零件。可以比较这些字符串。
答案 1 :(得分:1)
对于downvote和负面评论道歉,但我总是怀疑家庭作业类型的问题。为了弥补,我已经为你做了。你不需要awk,它可以用bash完成。
只需将F1和F2设置为正确的文件名即可。我将把它作为练习让你接受它们作为命令行参数:)
#!/usr/bin/env bash
F1=f1.tgz
F2=f2.tgz
VERSION_FILE=version.txt
version1=`tar -xzf $F1 -O $VERSION_FILE|sed -e 's/.*version=//'`
version2=`tar -xzf $F2 -O $VERSION_FILE|sed -e 's/.*version=//'`
if [ "$version1" == "$version2" ]; then
echo "$F1 and $F2 contain the same version: $version1, $version2"
exit 0;
fi
( # start a subshell because we're changing IFS
# Assume F1 is the latest file unless we find otherwise below
latest_file=$F1
latest_version=$version1
# set the Internal Field Separator to a dot so we can
# split the version strings into arrays
IFS=.
# make arrays of the version strings
v1parts=( $version1 )
v2parts=( $version2 )
# loop over $v1parts, comparing to $v2parts
# NOTE: this assumes the version strings have the same
# number of components. If wont work for 1.1 and 1.1.1,
# You'd have to have 1.1.0 and 1.1.1
# You could always add extra '0' components to the shorter array, but
# life's too short...
for ((i = 0 ; i < ${#v1parts[@]} ; i++ )); do
# NOTE: ${#v1parts[@]} is the length of the v1parts array
if [ "${v1parts[i]}" -lt "${v2parts[i]}" ]; then
latest_file=$F2
latest_version=$version2
break;
fi
done
echo "$latest_file is newer, version $latest_version"
)