仅按主要版本号和次要版本号匹配macOS版本号

时间:2017-03-17 15:40:40

标签: regex bash macos if-statement glob

尝试处理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

感谢。

2 个答案:

答案 0 :(得分:2)

=~内使用[[ ... ]],Bash的正则表达式匹配运算符:

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

例如,这与10.1210.12.3相匹配。

通过一些复制,您还可以在case语句中使用glob风格的模式,这可能是您的最佳选择:

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 (正则表达式)。

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

  • 相比之下, regexes 只能用于=~内{{1}}运算符的字符串匹配。

答案 1 :(得分:1)

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

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

因此如果$osv10.12.3v将为10.12。如果$osv仅为10.12,则v也将等于此值。