如何使用 Bash 对发布版本字符串进行降序排序

问题描述 投票:0回答:4

我有一个发布版本字符串列表,看起来像这样:

releases=( "1.3.1243" "2.0.1231" "0.8.4454" "1.2.4124" "1.2.3231" "0.9.5231" )

如何使用 bash 对我的

releases
数组进行排序,以便数组按降序排序(因此左侧的值具有最高优先级)。

所以排序后,上面的例子将按以下顺序:

"2.0.1231", "1.3.1243", "1.2.4124", "1.2.3231", "0.9.5231", "0.8.4454"
bash sorting sh
4个回答
3
投票

实际上,您可以使用 命令替换 和版本排序选项

sort
轻松完成此操作,例如

releases=($(printf "%s\n" "${releases[@]}" | sort -rV))

注意: printf-trick 只是将元素分隔在不同的行上,以便它们可以通过管道传输到

sort
进行排序。
printf "%s\n"
,尽管只有一个
"%s"
转换说明符,将处理所有输入)

现在

releases
包含:

releases=("2.0.1231" "1.3.1243" "1.2.4124" "1.2.3231" "0.9.5231" "0.8.4454")

1
投票
releases=( "1.3.1243" "2.0.1231" "0.8.4454" "1.2.4124" "1.2.3231" "0.9.5231" )
sorted=( $(echo ${releases[*]} | sed 's/ /\n/g' | sort -t. -k1,1rn -k2,2rn -k3,3rn) )
echo ${sorted[*]}

这使用

sed
sort
对项目进行反向排序,使用
.
作为字段分隔符,并将每个字段视为数字:

2.0.1231 1.3.1243 1.2.4124 1.2.3231 0.9.5231 0.8.4454

1
投票
releases=( "1.3.1243" "2.0.1231" "0.8.4454" "1.2.4124" "1.2.3231" "0.9.5231"
readarray -t sorted < <(printf '%s\n' "${releases[@]}" | sort -Vr)
declare -p sorted
declare -a sorted=([0]="2.0.1231" [1]="1.3.1243" [2]="1.2.4124" [3]="1.2.3231" [4]="0.9.5231" [5]="0.8.4454")

0
投票

为了从 Git 中提取最后一个标签,您可以

git tag | sort -rV | head -n 1

git tag | sort --version-sort | tail -n 1
© www.soinside.com 2019 - 2024. All rights reserved.