【问题标题】:Match the macOS version number only by major and minor version number仅通过主要和次要版本号匹配 macOS 版本号
【发布时间】:2017-03-17 15:40:39
【问题描述】:

尝试处理 10.12.3 的结果 - 当操作系统需要考虑可选的第三个数值时,我将如何编码?而且,当然,这经常变化,所以我不想寻找扩展更新。仅主 OS 10.12、10.11、10.10 等。

   if [ "$osv" = "10.12" ]; 
    then
        appi="Applications:App Store.app:Contents:Resources:AppIcon.icns"
    elif [ "$osv" = "10.11" ]; 
    then
        appi="Applications:App Store.app:Contents:Resources:appStore.icns"
    else
        exit
    fi

谢谢。

【问题讨论】:

    标签: regex bash macos if-statement glob


    【解决方案1】:

    [[ ... ]] 内部使用=~,Bash 的regex-matching 运算符:

    if [[ $osv =~ ^10\.12(\.?|$) ]]; # ...
    

    例如,这匹配 10.1210.12.3

    通过一些重复,您还可以在case 语句中使用全局样式模式,这可能是您的最佳选择:

    osv=$(sw_vers -productVersion) # yields, e.g., '10.12' or '10.12.3'
    case $osv in
      10.12|10.12.*)
        appi="Applications:App Store.app:Contents:Resources:AppIcon.icns"
        ;;
      10.11|10.11.*)
        appi="Applications:App Store.app:Contents:Resources:appStore.icns"
        ;;
      *)
        exit
    esac
    

    注意:

    • Patterns(也用于通配符)是:

      • 概念上更简单,但功能远不如正则表达式(正则表达式)。

      • 可用于[[ ... ]] 内部以及case 语句中== 的RHS 上的字符串匹配(见上文;在case 内部,它们的使用甚至符合POSIX)。

    • 相比之下,正则表达式只能用于[[ ... ]]内的字符串匹配,使用=~运算符。

    【讨论】:

      【解决方案2】:

      您可以使用变量$osv,只保留前两个字段(假设字段以. 分隔),然后在if/else 语句中使用结果:

      v=$(echo "$osv" | awk -F. 'BEGIN{OFS="."}{print $1,$2}')
      

      所以如果$osv10.12.3v 将是10.12。如果$osv 只是10.12v 也将等于这个值。

      【讨论】:

      • @JamesDean awk$osv 的内容作为其输入,将其拆分为字段(用-F 指定的分隔符),然后仅打印前两个并指定输出字段分隔符与OFS。然后使用$(...) 语法将此输出保存到变量v...
      • @JamesDean 或者您可以将此方法与sw_vers 结合使用并直接获取major.minor 版本为v=$(sw_vers -productVersion | awk -F. 'BEGIN{OFS="."}{print $1,$2}')
      • 如果版本号已经在一个shell变量中,这有点笨拙,但如果你调用sw_vers -productVersion,这是一个可行的方法,虽然sw_vers -productVersion | cut -d. -f1-2更简单。 (顺便说一句,可能很有趣:awk-F 选项通常需要 regex,但传递 . 是一个例外,字面意思处理 - 可能是因为按任何字符分割没有意义(你只会得到空字段)。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 2012-10-11
      • 1970-01-01
      • 2013-12-30
      • 2012-02-15
      • 2013-09-22
      • 1970-01-01
      相关资源
      最近更新 更多