BASH 从字符串中获取 major/minor 版本

BASH get major/minor version from string

我是一个相当新的 BASH 脚本,我正在尝试创建我自己的脚本 download/build 从源包。但是,我想在我的脚本中添加一些交互,以便将来为更新版本做好准备。

我的脚本询问用户他们想要安装的版本并生成 wget 命令并下载 link。请参阅以下摘录:

# Ask user for required version
read packversion

# Download version from internet (depending on version provided above)
wget https://example.com/download/1.10/src/$packversion.tar.gz -O package.tar.gz

这工作正常,但是如果您查看 url 它包含 1.10,我想从提供的文件中提取 major/minor 版本字符串并预先填充它。

有没有我可以用来实现这个的函数?

提前致谢。

是这样的吗?

$ cat script.sh 
#!/bin/bash
read packversion major minor
echo "https://example.com/download/${major}.${minor}/src/${packversion}.tar.gz -O package.tar.gz"

结果:

$ bash script.sh
foobar 2 25 # Input
https://example.com/download/2.25/src/foobar.tar.gz -O package.tar.gz

编辑: 使用这个:

#!/bin/bash
read packversion
if [[ $packversion =~ [0-9]+\.[0-9]+ ]]; then
  version=${BASH_REMATCH[0]}
else
  echo "Looks like \"$packversion\" doesn't contain proper version" && exit 1
fi
echo "https://example.com/download/${version}/src/${packversion}.tar.gz -O package.tar.gz"

结果:

$ bash 123.sh
something-1.2.3-else
https://example.com/download/1.2/src/something-1.2.3-else.tar.gz -O package.tar.gz

我通过执行以下操作成功实现了我的目标:

shortversion="$(cut -d '.' -f 1 <<< "$packversion")"."$(cut -d '.' -f 2 <<< "$packversion")"

这会创建一个新变量,我可以用它来创建 url。

wget https://example.com/download/$shortversion/src/package-$packversion.tar.gz

虽然不确定这是否是最好的方法,但对我有用。

在 bash 中,我能够做到这一点:

» export packversion=1.10.2
» export shortversion=${packversion%.*}
» printenv shortversion
1.10

来自 Arnold Robbins 的 Bash Pocket Reference(O'Reilly,2016 年,第 2 版):

${var%pattern} Use value of var after removing text matching pattern from the left. Remove the shortest matching piece.

这里的{.*}是要去除的模式,对应补丁版本号