我正在尝试从我有多个版本的一个程序的目录中获取最大版本号
例如,如果ls的输出是
something01_1.sh
something02_0.1.2.sh
something02_0.1.sh
something02_1.1.sh
something02_1.2.sh
something02_2.0.sh
something02_2.1.sh
something02_2.3.sh
something02_3.1.2.sh
something.sh
我正在使用以下内容获取最大版本号 -
ls somedir | grep some_prefix | cut -d '_' -f2 | sort -t '.' -k1 -r | head -n 1
现在,如果我想同时检查系统中已有的版本号,那么最好的方法就是这样做...
在bash中我得到了这个工作(如果2.5是当前版本)
(ls somedir | grep some_prefix | cut -d '_' -f2; echo 2.5) | sort -t '.' -k1 -r | head -n 1
还有其他正确的方法吗?
编辑:在上面的示例中,some_prefix是something02。
编辑:这里的实际问题是
(ls smthing; echo more) | sort
是将两个命令/程序的输出合并为第三个的最佳方法。
答案 0 :(得分:6)
我找到了解决方案。最好的方式是使用流程替换。
cat <(ls smthing) <(echo more) | sort
我的版本示例
cat <(ls somedir | grep some_prefix | cut -d '_' -f2) <(echo 2.5) | sort -t '.' -k1 -r | head -n 1
为了未来读者的利益,我建议 - 请放弃单行的诱惑,并使用glob建议chepner。
在superuser上提出几乎相似的问题。
有关process substitution的更多信息。
答案 1 :(得分:2)
以下代码是否更适合您所需的内容:
#/bin/bash
highest_version=$(ls something* | sort -V | tail -1 | sed "s/something02_\|\.sh//g")
current_version=$(echo $0 | sed "s/something02_\|\.sh//g")
if [ $current_version > $highest_version ]; then
echo "Uh oh! Looks like we need to update!";
fi
答案 2 :(得分:1)
您可以尝试这样的事情:
#! /bin/bash
lastversion() { # prefix
local prefix="$1" a=0 b=0 c=0 r f vmax=0
for f in "$prefix"* ; do
test -f "$f" || continue
read a b c r <<< $(echo "${f#$prefix} 0 0 0" | tr -C '[0-9]' ' ')
v=$(((a*100+b)*100+c))
if ((v>vmax)); then vmax=$v; fi
done
echo $vmax
}
lastversion "something02"
将打印:30102