0

我正在尝试从我有一个程序的多个版本的目录中获取最大版本号

例如,如果 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 

将管道的两个命令/程序的输出合并到第三个是最好的方法吗?

4

3 回答 3

8

我找到了解决方案。似乎最好的方法是使用进程替换。

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

为了未来读者的利益,我建议 - 请放弃单线的诱惑,并按照chepner 的建议使用 glob。

在superuser上提出了几乎类似的问题。

有关进程替换的更多信息。

于 2013-03-17T17:38:53.000 回答
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
于 2013-03-15T20:52:13.487 回答
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

于 2013-03-16T13:05:45.220 回答