我有一个具有以下结构的文件夹:
$ ls
DRS-1.1.0 DRS-1.3.0 DRS-1.3.1 DRS-1.3.2
随着时间的推移,文件夹版本将增加(例如 DRS-1.3.5
、DRS-1.4.1
等(
如何将最高版本的名称存储到变量中?(在当前情况下DRS-1.3.5
(
输出应为:
$ echo $VERSION
DRS-1.3.2
谢谢
使用 GNU 排序的版本排序:
printf '%sn' DRS-* | sort -V | tail -n 1
输出:
DRS-1.3.2
您可以使用
awk
来获取最大数量:
ver=$(printf '%sn' DRS-* | awk -F- '$2 > max{max=$2; f=$0} END{print f}')
echo "$ver"
DRS-1.3.2
Bash 按字母顺序对其 glob 扩展进行排序,因此我们可以索引此类扩展的最后一个元素:
files=(*)
VERSION=${files[$((${#files[*]}-1))]}
printf '%sn' "$VERSION"
与依赖于筛选基于行的输出的方法相比,这具有优势,因为它将处理所有文件名,即使它们包含换行符。
缺点是它仅限于排序规则排序,并且不能像(比如(dpkg --compare-versions
那样理解版本号;这将需要遍历数组,如下所示:
#!/bin/bash
set -eu
shopt -s nullglob
files=(DRS-*)
max=
for f in "${files[@]}"
do
dpkg --compare-versions "${f#DRS-}" gt "${max#DRS-}" || continue
max=$f
done
printf '%sn' "$max"
(当然,这仍然适用于包含换行符的文件名(
演示:
$ ls -1 DRS-*
DRS-1.1.0
DRS-1.12.0
DRS-1.3.0
DRS-1.3.1
DRS-1.3.2
$ ./find_max
DRS-1.12.0