BASH 从字符串中获取主要/次要版本

Cri*_*uck 12 linux sysadmin bash centos devops

我是一个非常新的 BASH 脚本,我正在尝试创建自己的脚本以从源下载/构建一个包。但是,我想在我的脚本中添加一些交互,以使其将来为更新版本做好准备。

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

# 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
Run Code Online (Sandbox Code Playgroud)

这工作正常,但是如果您查看它包含1.10的网址,我只想从提供的字符串中提取主要/次要版本并预先填充它。

有没有我可以使用的功能来实现这一点?

提前致谢。

小智 13

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

» export packversion=1.10.2
» export shortversion=${packversion%.*}
» printenv shortversion
1.10
Run Code Online (Sandbox Code Playgroud)

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

${ var % pattern }从左边删除文本匹配模式后使用var 的值。删除最短的匹配部分。

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

  • 这并不理想,因为如果“packversion”是“1.10”,那么“shortversion”最终会是“1”。即使未指定补丁,OP 可能也希望保留主要和次要内容。 (4认同)

Cri*_*uck 7

通过执行以下操作,我设法实现了我所追求的目标:

shortversion="$(cut -d '.' -f 1 <<< "$packversion")"."$(cut -d '.' -f 2 <<< "$packversion")"
Run Code Online (Sandbox Code Playgroud)

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

wget https://example.com/download/$shortversion/src/package-$packversion.tar.gz
Run Code Online (Sandbox Code Playgroud)

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

  • 快捷方式:“cut -d ”。-f 1,2 &lt;&lt;&lt; "$packversion"` (3认同)