使用 bash 命令的最新版本的 libssh2 和 libssl2?

Latest version of libssh2 and libssl2 using bash command?

我正在尝试使用自己的 bash 脚本参考 https://github.com/Frugghi/iSSH2 来为苹果平台生成 libssl 和 libssh 库。我想尝试自己的 bash 脚本的原因是获取最近的库并保持更新。

我有两个 bash 脚本来检测 openssl 和 libssh2 库的最新版本:

    getLibssh2Version () {
  if type git >/dev/null 2>&1; then
    LIBSSH_VERSION=`git ls-remote --tags https://github.com/libssh2/libssh2.git | egrep "libssh2-[0-9]+(\.[0-9])*[a-zA-Z]?$" | cut -f 2 -d - | sort -t . -r | head -n 1`
    LIBSSH_AUTO=true
}

    getOpensslVersion () {
  if type git >/dev/null 2>&1; then
    LIBSSL_VERSION=`git ls-remote --tags git://git.openssl.org/openssl.git | egrep "OpenSSL(_[0-9])+[a-zA-Z]?$" | cut -f 2,3,4 -d _ | sort -t _ -r | head -n 1 | tr _ .`
    LIBSSL_AUTO=true

}

但是第一个脚本获取的是 1.9.0 版本的 Libssh2 而不是 1.10.0 ,第二个脚本获取的是 1.1.1n 系列的 OpenSSL 而不是 3.0.2 。我猜这与定义的正则表达式有关。有人可以解决这个脚本错误吗?

在您的第一个片段中:

  • 您正在用 (\.[0-9])* 过滤 egrep 中的 1.10.0 版本,应该是 (\.[0-9]+)*.
  • 对于这些子修订版的数字排序,sort 需要更多选项:-t. -k 1,1n -k 2,2n
  • 我已经切换到不进行反向排序,而是使用 tail 而不是 head,因为反向排序在某种程度上不适用于其他选项(至少在我的机器上)。

解决方案:

git ls-remote --tags https://github.com/libssh2/libssh2.git | \
     egrep "libssh2-[0-9]+(\.[0-9]+)*[a-zA-Z]?$" | \
     cut -f 2 -d - | sort -t. -k 1,1n -k 2,2n | tail -n 1

输出:

1.10.0

在第二个片段中:

  • 命名和标点符号从 1.x 版本更改为 3.x 版本,因此它们被 egrep 过滤掉了。我会天真地使用 egrep -i "OpenSSL([_.-][0-9])+[a-zA-Z]?$".
  • 而不是 egrep "OpenSSL(_[0-9])+[a-zA-Z]?$"
  • 因此,具有 cut 的版本“提取”对于较新的版本失败。自发地,我选择使用 sed 's/.*openssl.//i' 来做同样的事情。
  • 我再次从使用 head 切换到 tail
  • 注意 sorting 遇到与第一个片段相同的问题,即当这些子修订开始滚动时,例如从 3.9...3.10...,您需要添加与上述相同的选项。

解决方案:

git ls-remote --tags git://git.openssl.org/openssl.git | \
    egrep -i "OpenSSL([_.-][0-9])+[a-zA-Z]?$" | \
    sed 's/.*openssl.//i' | sort -t _ | tail -n 1 | tr _ .

输出:

3.0.2

您需要执行 grep-oP 选项的 Perl 样式正则表达式匹配。

正在获取 libssh2 最新版本。

git ls-remote --tags https://github.com/libssh2/libssh2.git | grep -oP "libssh2-([\d.]*)" | tail -1 | grep -oP "(?<=-).*"

正在获取 openssl 最新版本。

git ls-remote --tags git://git.openssl.org/openssl.git | grep -oP "openssl-([\d.]*)" | tail -1 | grep -oP "(?<=-).*"