2017-03-17 210 views
1

嘗試處理10.12.3的結果 - 當操作系統具有可選的第三數字值時,我將如何對此進行編碼?當然,這經常變化,所以我不想尋找擴展更新。只是主操作系統10.12,10.11,10.10等僅匹配主版本號和次版本號的macOS版本號

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 

謝謝。

回答

1

,你可以把你的變量$osv,只保留了前兩個字段(假設領域與.分隔),並在if/else聲明(S)使用結果:

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

所以如果$osv10.12.3v將是10.12。在$osv僅僅是10.12的情況下,v也將等於該值。

+0

@JamesDean'awk'需要的'$ osv'內容作爲它的輸入,將其分解成(用'-F'指定的分隔符)字段,然後僅打印頭兩個加入了與所指定的輸出字段分隔符與'OFS'。然後使用'$(...)'語法將該輸出保存到變量'v'中... – ewcz

+1

@JamesDean或者你可以將這個方法與'sw_vers'結合起來,並直接獲得major.minor版本爲'v = $(sw_vers -productVersion | awk -F。'BEGIN {OFS =「。」} {print $ 1,$ 2}')' – ewcz

+0

如果版本號已經在shell變量中,這有點笨重,但如果你無論如何都調用'sw_vers -productVersion',這是一個可行的方法,儘管'sw_vers -productVersion |切-d。 -f1-2'更簡單。(作爲一個潛在的有趣的一面:awk的'-F'選項通常期望_regex_,但通過'.'是一個異常,被視爲_literally_ - 也許是因爲任何字符的分割都沒有意義(你' d只能得到空字段)。) – mklement0

2

使用=~,bash的正則表達式匹配運營商內部[[ ... ]]

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

    • 在概念上更簡單,但遠不如正則表達式(正則表達式)。

    • 可以case語句被用於對==內部[[ ... ]]的RHS字符串匹配以及(見上文;內部case,它們的使用是偶數POSIX兼容的)。

  • 相比之下,正則表達式可以只能用於字符串匹配內部[[ ... ]]=~運算符。