我有一个发布版本字符串列表,看起来像这样:
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[*]}
这使用
sed
和 sort
对项目进行反向排序,使用 .
作为字段分隔符,并将每个字段视为数字:
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")
为了从 Git 中提取最后一个标签,您可以
git tag | sort -rV | head -n 1
或
git tag | sort --version-sort | tail -n 1