仅通过主要和次要版本号匹配 macOS 版本号

Match the macOS version number only by major and minor version number

尝试处理 10.12.3 的结果 - 当 OS 有可选的第三个数值要考虑时,我将如何编码?而且,当然,这经常变化,所以我不想寻找扩展更新。只是主要 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

谢谢。

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

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

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

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

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

这匹配 10.1210.12.3,例如。

通过一些重复,您还可以在 case 语句中使用 glob-style patterns,这可能是您的最佳选择:

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(也用于 globbing)是:

    • 在概念上更简单,但比 regexes(正则表达式)更强大。

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

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