首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何捕获存储在shell脚本中的变量中的版本号的一部分

如何捕获存储在shell脚本中的变量中的版本号的一部分
EN

Stack Overflow用户
提问于 2021-07-15 16:56:03
回答 3查看 101关注 0票数 0

我试图在bash脚本中解析一些数据,并测试版本号的第二部分。下面是一些示例文本,存储在一个名为myinfo的变量中

代码语言:javascript
复制
Application 2021:

Version: 16.3.2.151
--
Application 2020:

Version: 15.1.3.302

我只需要捕获以16 (本例中的3)开头的第二部分,并测试它是否为3或更高版本。

我尝试了很多不同的答案,在网上似乎是相关的,但没有成功。

例如,我得到的最接近的是使用regex (?:\b16\.)(\d) works在regexr上找到16.3,但我还没有弄清楚如何只捕获3(如果我更了解regex,可能很容易)。

更新:

感谢保罗·霍奇斯简洁的回答。背景是,我需要找到用户在系统上的Adobe的确切版本。16.3及以上版本在脚本的其余部分需要不同的行为。这可以适用于任何需要知道应用程序版本号的情况。下面是最后一个脚本,利用我选择的解决方案:

代码语言:javascript
复制
#!/bin/bash

# Ask system_profiler for information about all the installed applications
#  then use fgrep to pull out the line, and the 2 lines after, that starts with Adobe InDesign 2021
v=$(system_profiler SPApplicationsDataType | fgrep -A 2 ' Adobe InDesign 2021')

echo ${v}
#    Adobe InDesign 2021:
#
#      Version: 16.3.2.151

# Strip everything up to the first .
v="${v#*.}"
# Strip everything after the first . of the remaining text
v="${v%%.*}"

echo "${v}"
# 3

# Test if it is greater or equal to 3
if [[ "${v}" -ge 3 ]]; then
    echo Its 3 or greater
else
    echo Less than 3
fi
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-07-15 17:56:38

参数解析可以在几个步骤中完成,而不需要运行子进程。

假设

代码语言:javascript
复制
x="Application 2021:

Version: 16.3.2.151
--
Application 2020:

Version: 15.1.3.302"

然后

代码语言:javascript
复制
x="${x#*.}"

从前面到第一个点,把所有的东西都剥掉,

代码语言:javascript
复制
x="${x%%.*}"

从现在开始到最后,把所有的东西都剥掉。

代码语言:javascript
复制
echo $x
3

所以如果你的数据在x中,

代码语言:javascript
复制
x="${x#*.}"; echo ${x%%.*}

将输出3

如果您想要更精确的解析,请激活扩展全局。

代码语言:javascript
复制
$: shopt -s extglob
$: y="${x//*Application+([[:space:]])2021:+([[:space:]])Version:+([[:space:]])+([0-9])./}"
$: echo "${y%%.*}"
3

请记住,这是全局的,而不是真正的正则表达式解析。

为此,请使用sedawk,尽管这样可以很好地完成任务。

有关全球化的更多详细信息,c.f。https://mywiki.wooledge.org/glob

有关基本参数解析的更多信息,请参见c.f。https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html

票数 1
EN

Stack Overflow用户

发布于 2021-07-15 17:08:36

假设只有一组与Application 2021:Version:匹配的行

输入变量:

代码语言:javascript
复制
$ typeset -p myinfo
declare -- myinfo="Application 2021:

Version: 16.3.2.151
--
Application 2020:

Version: 15.1.3.302"

sed的一个想法是:

代码语言:javascript
复制
$ sed -En '/^Application 2021:/,/^Version:/ s/^Version: [^\.]*\.([^\.]+).*/\1/p' <<< "${myinfo}"
3

其中:

  • -En --支持E regex regex;space
  • '/^Application 2021:/,/^Version:/抑制打印模式的默认行为-查找第一行以Application 2021:开头的行范围,最后一行以以Version: + <anything_not_a_period> + . (文字周期) ...
  • ([^\.]+)开头的行(在所需的行范围内)开始( period
  • .*后的文字周期)--第一捕获组是所有不是文字period
  • .*的东西--匹配行

H 129/\1/p -打印第一个捕获组

将此值捕获到变量中:

代码语言:javascript
复制
$ v=$(sed -En '/^Application 2021:/,/^Version:/ s/^Version: [^\.]*\.([^\.]+).*/\1/p' <<< "${myinfo}")
$ echo "${v}"
3

从这里开始,OP可以使用变量${v}做任何想做的事情,例如:

代码语言:javascript
复制
if [[ "${v}" -gt 3 ]]; then ...
票数 1
EN

Stack Overflow用户

发布于 2021-07-15 18:22:24

代码语言:javascript
复制
awk -F'[ :.]' '
  $1 == "Application" && $2 == 2021 {p = 1}
  p && $1 == "Version" {print $4; exit}
' <<<"$myinfo"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68397917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档