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

How to sort release version string in descending order with Bash

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

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"

实际上,您可以使用 命令替换 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")
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[*]}

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

2.0.1231 1.3.1243 1.2.4124 1.2.3231 0.9.5231 0.8.4454
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")