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

时间:2018-03-13 09:36:34

标签: linux bash centos devops sysadmin

我是一个非常新的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

这样可行,但是如果你查看它包含 1.10 的网址,我想从提供的字符串中提取主要/次要版本并预先填充它。

我可以用它来实现这个功能吗?

提前致谢。

3 个答案:

答案 0 :(得分:2)

我通过以下方式成功实现了我的目标:

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

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

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

虽然不确定它是否是最好的方式,但对我来说很有用。

答案 1 :(得分:2)

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

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

来自Arnold Robbins的 Bash Pocket Reference (O&#39; Reilly,2016年第2版):

  

$ { var 模式}删除文本后使用 var 的值                      从左侧匹配模式。去掉                      最短的匹配件。

此处,{。*}是要删除的模式,对应于补丁版本号。

答案 2 :(得分:0)

这样的事情?

$ 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