首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >匹配/bin/sh中的包版本字符串

匹配/bin/sh中的包版本字符串
EN

Stack Overflow用户
提问于 2015-11-26 23:39:58
回答 1查看 319关注 0票数 2

我试图匹配给定的字符串,并将其与/bin/sh脚本中的包版本相匹配:

代码语言:javascript
运行
复制
if test "x$version" = "x"; then
  version="latest";
  info "Version parameter not defined, assuming latest";
else
  info "Version parameter defined: $version";
  info "Matching version to package version"
  case "$version" in
    [^4.0.]*)
      $package_version='1.0.1'
      ;;
    [^4.1.]*)
      $package_version='1.1.1'
      ;;
    [^4.2.]*)
      $package_version='1.2.6'
      ;;
    *)
      critical "Unable to match requested version to package version"
      exit 1
      ;;
  esac
fi

但是,当我运行它时,我会得到一个错误:

代码语言:javascript
运行
复制
23:38:47 +0000 INFO: Version parameter defined: 4.0.0
23:38:47 +0000 INFO: Matching Puppet version to puppet-agent package version (See http://docs.puppetlabs.com/puppet/latest/reference/about_agent.html for more details)
23:38:47 +0000 CRIT: Unable to match requested puppet version to puppet-agent version - Check http://docs.puppetlabs.com/puppet/latest/reference/about_agent.html
23:38:47 +0000 CRIT: Please file a bug report at https://github.com/petems/puppet-install-shell/
23:38:47 +0000 CRIT:
23:38:47 +0000 CRIT: Version: 4.0.0

在脚本的另一部分中,我使用了与我相同的正则表达式:,它似乎在那里工作:

代码语言:javascript
运行
复制
if test "$version" = 'latest'; then
        apt-get install -y puppet-common puppet
      else
        case "$version" in
          [^2.7.]*)
            info "2.7.* Puppet deb package tied to Facter < 2.0.0, specifying Facter 1.7.4"
            apt-get install -y puppet-common=$version-1puppetlabs1 puppet=$version-1puppetlabs1 facter=1.7.4-1puppetlabs1 --force-yes
            ;;
          *)
            apt-get install -y puppet-common=$version-1puppetlabs1 puppet=$version-1puppetlabs1 --force-yes
            ;;
        esac
      fi

我遗漏了什么?

脚本的完整版本如下:agent.sh

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-27 00:16:53

  • POSIX脚本中的case ... esac使用的是(glob-style) ,而不是正则表达式(虽然两者关系遥远,但有根本的区别)。
代码语言:javascript
运行
复制
- To get true regex matching in a `sh` script, you'd have to use `expr` with `:`, though it's probably not needed here. 

  • 为了测试前缀匹配,在一个<prefix>*分支中使用case分支总是与整个参数匹配-不需要锚定(模式不支持)。
代码语言:javascript
运行
复制
- As an aside, what you're attempting would not even work for prefix matching as a _regex_. E.g., `[^4.0.]` is the same as `[^.04]` - i.e., a _negated_ character _class_: it matches _one_ character if it is neither `.` nor `0` nor `4`.

  • 当分配给POSIX脚本中的变量时,不要使用$

把它们放在一起:

代码语言:javascript
运行
复制
#/bin/sh

if [ "$version" = "" ]; then
  version="latest";
  info "Version parameter not defined, assuming latest"
else
  info "Version parameter defined: $version";
  info "Matching version to package version"
  case "$version" in
    4.0.*)
      package_version='1.0.1'
      ;;
    4.1.*)
      package_version='1.1.1'
      ;;
    4.2.*)
      package_version='1.2.6'
      ;;
    *)
      critical "Unable to match requested version to package version"
      exit 1
      ;;
  esac
fi
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33948484

复制
相关文章

相似问题

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