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.
这里的{.*}是要去除的模式,对应补丁版本号
我是一个相当新的 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.
这里的{.*}是要去除的模式,对应补丁版本号